From 128173339e7cbdaec90b9692ae8163eb97d96c34 Mon Sep 17 00:00:00 2001 From: k4rli Date: Sun, 12 Oct 2025 22:41:10 +0300 Subject: [PATCH] nice --- build.gradle | 8 +- runelite-plugin.properties | 2 +- .../java/ee/futur/baseapi/BaseApiPlugin.java | 1179 ++++++++++++++ .../ee/futur/baseapi/collections/Bank.java | 82 + .../baseapi/collections/BankInventory.java | 41 + .../baseapi/collections/BankItemWidget.java | 882 ++++++++++ .../futur/baseapi/collections/DepositBox.java | 68 + .../futur/baseapi/collections/ETileItem.java | 34 + .../futur/baseapi/collections/Equipment.java | 105 ++ .../collections/EquipmentItemWidget.java | 812 ++++++++++ .../futur/baseapi/collections/Inventory.java | 55 + .../ee/futur/baseapi/collections/NPCs.java | 32 + .../ee/futur/baseapi/collections/Players.java | 30 + .../ee/futur/baseapi/collections/Shop.java | 64 + .../baseapi/collections/ShopInventory.java | 79 + .../futur/baseapi/collections/TileItems.java | 14 + .../baseapi/collections/TileObjects.java | 77 + .../baseapi/collections/TradeInventory.java | 41 + .../ee/futur/baseapi/collections/Widgets.java | 76 + .../collections/query/EquipmentItemQuery.java | 88 + .../baseapi/collections/query/ItemQuery.java | 157 ++ .../baseapi/collections/query/NPCQuery.java | 232 +++ .../collections/query/PlayerQuery.java | 131 ++ .../collections/query/QuickPrayer.java | 44 + .../collections/query/TileItemQuery.java | 219 +++ .../collections/query/TileObjectQuery.java | 179 +++ .../collections/query/WidgetQuery.java | 120 ++ .../interaction/TileObjectInteraction.java | 43 + .../baseapi/nono/packets/BufferMethods.java | 106 ++ .../baseapi/nono/packets/MousePackets.java | 127 ++ .../baseapi/nono/packets/MovementPackets.java | 16 + .../baseapi/nono/packets/NPCPackets.java | 81 + .../baseapi/nono/packets/ObjectPackets.java | 107 ++ .../baseapi/nono/packets/PlayerPackets.java | 77 + .../baseapi/nono/packets/TileItemPackets.java | 50 + .../baseapi/nono/packets/WidgetPackets.java | 118 ++ .../nono/packets/utils/ObfuscatedNames.java | 523 ++++++ .../nono/packets/utils/ObjectAndType.java | 11 + .../baseapi/nono/packets/utils/PacketDef.java | 232 +++ .../nono/packets/utils/PacketReflection.java | 290 ++++ .../nono/packets/utils/PacketType.java | 21 + .../nono/packets/utils/PacketUtilsConfig.java | 27 + .../nono/packets/utils/PacketUtilsPlugin.java | 336 ++++ .../baseapi/nono/packets/utils/WidgetID.java | 1412 +++++++++++++++++ .../packets/utils/WidgetInfoExtended.java | 1007 ++++++++++++ .../pathfinding/GlobalCollisionMap.java | 104 ++ .../ee/futur/baseapi/pathfinding/Node.java | 35 + .../futur/baseapi/utils/WorldAreaUtility.java | 110 ++ .../baseapi/utils/WorldPointUtility.java | 23 + .../futur}/easygiantsfoundry/BonusWidget.java | 2 +- .../EasyGiantsFoundryClientIDs.java | 2 +- .../EasyGiantsFoundryConfig.java | 4 +- .../EasyGiantsFoundryHelper.java | 2 +- .../EasyGiantsFoundryPlugin.java | 8 +- .../EasyGiantsFoundryState.java | 16 +- .../easygiantsfoundry/FoundryOverlay2D.java | 8 +- .../easygiantsfoundry/FoundryOverlay3D.java | 20 +- .../easygiantsfoundry/HeatActionSolver.java | 4 +- .../HeatActionStateMachine.java | 2 +- .../easygiantsfoundry/HighlightStyle.java | 2 +- .../futur}/easygiantsfoundry/MathUtil.java | 2 +- .../easygiantsfoundry/MetalBarCounter.java | 6 +- .../easygiantsfoundry/MetalBarValues.java | 6 +- .../futur}/easygiantsfoundry/MouldHelper.java | 6 +- .../enums/CommissionType.java | 2 +- .../easygiantsfoundry/enums/FontType.java | 2 +- .../futur}/easygiantsfoundry/enums/Heat.java | 2 +- .../enums/MetalBarSource.java | 2 +- .../easygiantsfoundry/enums/MetalBarType.java | 2 +- .../futur}/easygiantsfoundry/enums/Mould.java | 6 +- .../easygiantsfoundry/enums/MouldType.java | 2 +- .../futur}/easygiantsfoundry/enums/Stage.java | 2 +- .../java/ee/futur/gotr/AutoRiftsConfig.java | 277 ++++ .../java/ee/futur/gotr/AutoRiftsOverlay.java | 70 + .../java/ee/futur/gotr/AutoRiftsPlugin.java | 994 ++++++++++++ .../java/ee/futur/gotr/AutoRiftsState.java | 25 + src/main/java/ee/futur/gotr/GOTRState.java | 442 ++++++ src/main/java/ee/futur/gotr/PouchManager.java | 214 +++ src/main/java/ee/futur/gotr/README.md | 32 + src/main/java/ee/futur/gotr/data/Altar.java | 45 + .../java/ee/futur/gotr/data/CellMapper.java | 38 + .../java/ee/futur/gotr/data/Constants.java | 74 + src/main/java/ee/futur/gotr/data/Pouch.java | 24 + src/main/java/ee/futur/gotr/data/Runes.java | 77 + src/main/java/ee/futur/gotr/data/Utility.java | 49 + .../java/ee/futur/utils/InventoryUtil.java | 186 +++ .../java/ee/futur/utils/ObfuscatedNames.java | 523 ++++++ .../EasyGiantsFoundryPluginTest.java | 13 - .../easygiantsfoundry/K4rliPluginsTest.java | 18 + 89 files changed, 12846 insertions(+), 72 deletions(-) create mode 100644 src/main/java/ee/futur/baseapi/BaseApiPlugin.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Bank.java create mode 100644 src/main/java/ee/futur/baseapi/collections/BankInventory.java create mode 100644 src/main/java/ee/futur/baseapi/collections/BankItemWidget.java create mode 100644 src/main/java/ee/futur/baseapi/collections/DepositBox.java create mode 100644 src/main/java/ee/futur/baseapi/collections/ETileItem.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Equipment.java create mode 100644 src/main/java/ee/futur/baseapi/collections/EquipmentItemWidget.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Inventory.java create mode 100644 src/main/java/ee/futur/baseapi/collections/NPCs.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Players.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Shop.java create mode 100644 src/main/java/ee/futur/baseapi/collections/ShopInventory.java create mode 100644 src/main/java/ee/futur/baseapi/collections/TileItems.java create mode 100644 src/main/java/ee/futur/baseapi/collections/TileObjects.java create mode 100644 src/main/java/ee/futur/baseapi/collections/TradeInventory.java create mode 100644 src/main/java/ee/futur/baseapi/collections/Widgets.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/EquipmentItemQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/ItemQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/NPCQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/PlayerQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/QuickPrayer.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/TileItemQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/TileObjectQuery.java create mode 100644 src/main/java/ee/futur/baseapi/collections/query/WidgetQuery.java create mode 100644 src/main/java/ee/futur/baseapi/nono/interaction/TileObjectInteraction.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/BufferMethods.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/MousePackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/MovementPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/NPCPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/ObjectPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/PlayerPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/TileItemPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/WidgetPackets.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/ObfuscatedNames.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/ObjectAndType.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/PacketDef.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/PacketReflection.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/PacketType.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsConfig.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsPlugin.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetID.java create mode 100644 src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetInfoExtended.java create mode 100644 src/main/java/ee/futur/baseapi/pathfinding/GlobalCollisionMap.java create mode 100644 src/main/java/ee/futur/baseapi/pathfinding/Node.java create mode 100644 src/main/java/ee/futur/baseapi/utils/WorldAreaUtility.java create mode 100644 src/main/java/ee/futur/baseapi/utils/WorldPointUtility.java rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/BonusWidget.java (92%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/EasyGiantsFoundryClientIDs.java (97%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/EasyGiantsFoundryConfig.java (99%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/EasyGiantsFoundryHelper.java (97%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/EasyGiantsFoundryPlugin.java (98%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/EasyGiantsFoundryState.java (93%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/FoundryOverlay2D.java (98%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/FoundryOverlay3D.java (96%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/HeatActionSolver.java (98%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/HeatActionStateMachine.java (99%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/HighlightStyle.java (63%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/MathUtil.java (70%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/MetalBarCounter.java (95%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/MetalBarValues.java (98%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/MouldHelper.java (96%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/CommissionType.java (89%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/FontType.java (91%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/Heat.java (90%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/MetalBarSource.java (56%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/MetalBarType.java (64%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/Mould.java (95%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/MouldType.java (51%) rename src/main/java/{com/toofifty => ee/futur}/easygiantsfoundry/enums/Stage.java (92%) create mode 100644 src/main/java/ee/futur/gotr/AutoRiftsConfig.java create mode 100644 src/main/java/ee/futur/gotr/AutoRiftsOverlay.java create mode 100644 src/main/java/ee/futur/gotr/AutoRiftsPlugin.java create mode 100644 src/main/java/ee/futur/gotr/AutoRiftsState.java create mode 100644 src/main/java/ee/futur/gotr/GOTRState.java create mode 100644 src/main/java/ee/futur/gotr/PouchManager.java create mode 100644 src/main/java/ee/futur/gotr/README.md create mode 100644 src/main/java/ee/futur/gotr/data/Altar.java create mode 100644 src/main/java/ee/futur/gotr/data/CellMapper.java create mode 100644 src/main/java/ee/futur/gotr/data/Constants.java create mode 100644 src/main/java/ee/futur/gotr/data/Pouch.java create mode 100644 src/main/java/ee/futur/gotr/data/Runes.java create mode 100644 src/main/java/ee/futur/gotr/data/Utility.java create mode 100644 src/main/java/ee/futur/utils/InventoryUtil.java create mode 100644 src/main/java/ee/futur/utils/ObfuscatedNames.java delete mode 100644 src/test/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPluginTest.java create mode 100644 src/test/java/ee/futur/easygiantsfoundry/K4rliPluginsTest.java diff --git a/build.gradle b/build.gradle index 20bff8b..20655ca 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,8 @@ def runeLiteVersion = 'latest.release' dependencies { compileOnly group: 'net.runelite', name: 'client', version: runeLiteVersion + implementation 'org.roaringbitmap:RoaringBitmap:0.9.44' + compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' @@ -26,7 +28,7 @@ dependencies { testImplementation group: 'net.runelite', name: 'jshell', version: runeLiteVersion } -group = 'com.toofifty' +group = 'ee.futur' version = '1.0.11' tasks.withType(JavaCompile).configureEach { @@ -38,7 +40,7 @@ tasks.register('shadowJar', Jar) { dependsOn configurations.testRuntimeClasspath manifest { attributes('Main-Class': - 'com.toofifty.easygiantsfoundry.EasyGiantsFoundryPluginTest', + 'ee.futur.easygiantsfoundry.EasyGiantsFoundryPluginTest', 'Multi-Release': true) } @@ -67,6 +69,6 @@ task runClient(type: JavaExec) { group = 'application' description = 'Run the PluginTester main class to launch RuneLite with plugins' classpath = sourceSets.test.runtimeClasspath - mainClass = 'com.toofifty.easygiantsfoundry.EasyGiantsFoundryPluginTest' + mainClass = 'ee.futur.easygiantsfoundry.EasyGiantsFoundryPluginTest' jvmArgs '-ea' } diff --git a/runelite-plugin.properties b/runelite-plugin.properties index bd94e55..2f094c8 100644 --- a/runelite-plugin.properties +++ b/runelite-plugin.properties @@ -3,4 +3,4 @@ author=Toofifty support=https://github.com/Toofifty/easy-giantsfoundry description=Helpful overlays for the Giants' Foundry minigame tags=smithing,giant,foundry,giantsfoundry,minigame,ez,easy,smith -plugins=com.toofifty.easygiantsfoundry.EasyGiantsFoundryPlugin +plugins=ee.futur.easygiantsfoundry.EasyGiantsFoundryPlugin diff --git a/src/main/java/ee/futur/baseapi/BaseApiPlugin.java b/src/main/java/ee/futur/baseapi/BaseApiPlugin.java new file mode 100644 index 0000000..7e2b40c --- /dev/null +++ b/src/main/java/ee/futur/baseapi/BaseApiPlugin.java @@ -0,0 +1,1179 @@ +package ee.futur.baseapi; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.inject.Inject; +import ee.futur.baseapi.collections.*; +import ee.futur.baseapi.collections.query.QuickPrayer; +import ee.futur.baseapi.pathfinding.Node; +import ee.futur.utils.ObfuscatedNames; +import lombok.SneakyThrows; +import net.runelite.api.*; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.game.ItemManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginInstantiationException; +import net.runelite.client.plugins.PluginManager; +import net.runelite.client.ui.ClientUI; +import net.runelite.client.util.Text; +import net.runelite.client.util.WildcardMatcher; + +import javax.swing.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static net.runelite.api.Varbits.QUICK_PRAYER; + +@PluginDescriptor( + name = "BaseApiPlugin", + description = "", + tags = {"base-api", "k4rli"}, + hidden = false +) +public class BaseApiPlugin extends Plugin { + static ClientUI clientUI = RuneLite.getInjector().getInstance(ClientUI.class); + static Client client = RuneLite.getInjector().getInstance(Client.class); + static PluginManager pluginManager = RuneLite.getInjector().getInstance(PluginManager.class); + static ItemManager itemManager = RuneLite.getInjector().getInstance(ItemManager.class); + static Method doAction = null; + static String animationField = null; + static long animationMult; + static final HashSet EMPTY_SET = new HashSet<>(); + public static final int[][] directionsMap = { + {-2, 0}, + {0, 2}, + {2, 0}, + {0, -2}, + {1, 0}, + {0, 1}, + {-1, 0}, + {0, -1}, + {1, 1}, + {-1, -1}, + {-1, 1}, + {1, -1}, + {-2, 2}, + {-2, -2}, + {2, 2}, + {2, -2}, + {-2, -1}, + {-2, 1}, + {-1, -2}, + {-1, 2}, + {1, -2}, + {1, 2}, + {2, -1}, + {2, 1} + }; + @Inject + EventBus eventBus; + public static LoadingCache itemDefs = CacheBuilder.newBuilder() + .maximumSize(1000) + .expireAfterWrite(20, TimeUnit.MINUTES) + .build( + new CacheLoader() { + @Override + public ItemComposition load(Integer itemId) { + return itemManager.getItemComposition(itemId); + } + }); + + + public static boolean loggedIn() { + return client.getGameState() == GameState.LOGGED_IN; + } + + public static boolean inRegion(int regionID) { + List mapRegions = Arrays.stream(client.getMapRegions()).boxed().collect(Collectors.toList()); + return mapRegions.contains(regionID); + } + + public static WorldPoint playerPosition() { + return client.getLocalPlayer().getWorldLocation(); + } + + @Deprecated //apparently RL no longer blocks this on non-local players. + public static int getSkullIcon(Player player) { + return player.getSkullIcon(); + } + + public static boolean isQuickPrayerActive(QuickPrayer prayer) { + return (client.getVarbitValue(4102) & (int) Math.pow(2, prayer.getIndex())) == Math.pow(2, prayer.getIndex()); + } + + public static boolean isQuickPrayerEnabled() { + return client.getVarbitValue(QUICK_PRAYER) == 1; + } + + + @SneakyThrows + public static int getAnimation(NPC npc) { + if (npc == null) { + return -1; + } + if (animationField == null || animationMult == 0) { + Field[] fields = Arrays.stream(npc.getClass().getSuperclass().getDeclaredFields()).filter(x -> x.getType() == int.class && !Modifier.isFinal(x.getModifiers()) && !Modifier.isStatic(x.getModifiers())).toArray(Field[]::new); + boolean[] changed = new boolean[fields.length]; + int[] values = new int[fields.length]; + for (int i = 0; i < fields.length; i++) { + fields[i].setAccessible(true); + values[i] = fields[i].getInt(npc); + changed[i] = false; + } + Random rand = new Random(); + for (int i = 0; i < 5; i++) { + npc.setAnimation(rand.nextInt(Integer.MAX_VALUE)); + for (int i1 = 0; i1 < values.length; i1++) { + if (values[i1] != fields[i1].getInt(npc)) { + changed[i1] = true; + } + } + } + int animationFieldIndex = -1; + for (int i = 0; i < changed.length; i++) { + if (changed[i]) { + if (animationFieldIndex != -1) { + System.out.println("too many changed"); + return -1; + } + animationFieldIndex = i; + } + } + String fieldName = fields[animationFieldIndex].getName(); + fields[animationFieldIndex].setInt(npc, 1); + long multiplier = npc.getAnimation(); + for (Field field : fields) { + field.setAccessible(false); + } + animationField = fieldName; + animationMult = multiplier; + } + Field animation = npc.getClass().getSuperclass().getDeclaredField(animationField); + animation.setAccessible(true); + int anim = (int) (animation.getInt(npc) * animationMult); + animation.setAccessible(false); + return anim; + } + + public static HeadIcon headIconThruLengthEightArrays(NPC npc) throws IllegalAccessException { + Class[] trying = new Class[]{npc.getClass(), npc.getComposition().getClass()}; + for (Class aClass : trying) { + for (Field declaredField : aClass.getDeclaredFields()) { + Field[] decFields = declaredField.getType().getDeclaredFields(); + if (decFields.length == 2) { + if (decFields[0].getType().isArray() && decFields[1].getType().isArray()) { + for (Field decField : decFields) { + decField.setAccessible(true); + } + Object[] array1 = (Object[]) decFields[0].get(npc); + Object[] array2 = (Object[]) decFields[1].get(npc); + for (Field decField : decFields) { + decField.setAccessible(false); + } + if (array1.length == 8 & array2.length == 8) { + if (decFields[0].getType() == short[].class) { + if ((short) array1[0] == -1) { + return null; + } + return HeadIcon.values()[(short) array1[0]]; + } + if ((short) array2[0] == -1) { + return null; + } + return HeadIcon.values()[(short) array2[0]]; + } + } + } + } + } + return null; + } + + @SneakyThrows + public static HeadIcon getHeadIcon(NPC npc) { + if (npc == null) return null; + HeadIcon icon = getOldHeadIcon(npc); + if (icon != null) { + //System.out.println("Icon returned using oldHeadIcon"); + return icon; + } + icon = getOlderHeadicon(npc); + if (icon != null) { + //System.out.println("Icon returned using OlderHeadicon"); + return icon; + } + //System.out.println("Icon returned using headIconThruLengthEightArrays"); + icon = headIconThruLengthEightArrays(npc); + return icon; + } + + @SneakyThrows + public static HeadIcon getOlderHeadicon(NPC npc) { + Method getHeadIconMethod = null; + for (Method declaredMethod : npc.getComposition().getClass().getDeclaredMethods()) { + if (declaredMethod.getName().length() == 2 && declaredMethod.getReturnType() == short.class && declaredMethod.getParameterCount() == 1) { + getHeadIconMethod = declaredMethod; + getHeadIconMethod.setAccessible(true); + short headIcon = -1; + try { + headIcon = (short) getHeadIconMethod.invoke(npc.getComposition(), 0); + } catch (Exception e) { + //nothing + } + getHeadIconMethod.setAccessible(false); + + if (headIcon == -1) { + continue; + } + return HeadIcon.values()[headIcon]; + } + } + return null; + } + + @SneakyThrows + public static HeadIcon getOldHeadIcon(NPC npc) { + Method getHeadIconMethod; + for (Method declaredMethod : npc.getClass().getDeclaredMethods()) { + if (declaredMethod.getName().length() == 2 && declaredMethod.getReturnType() == short[].class && declaredMethod.getParameterCount() == 0) { + getHeadIconMethod = declaredMethod; + getHeadIconMethod.setAccessible(true); + short[] headIcon = null; + try { + headIcon = (short[]) getHeadIconMethod.invoke(npc); + } catch (Exception e) { + //nothing + } + getHeadIconMethod.setAccessible(false); + + if (headIcon == null) { + continue; + } + return HeadIcon.values()[headIcon[0]]; + } + } + return null; + } + + @Deprecated + public int countItem(String str, WidgetInfo container) { + Widget[] items = client.getWidget(container).getDynamicChildren(); + int count = 0; + for (int i = 0; i < items.length; i++) { + if (WildcardMatcher.matches(str.toLowerCase(), Text.removeTags(items[i].getName()).toLowerCase())) { + count++; + } + } + return count; + } + + @Deprecated + public static Widget getItem(String str) { + Widget[] items = client.getWidget(WidgetInfo.INVENTORY).getDynamicChildren(); + for (int i = 0; i < items.length; i++) { + if (WildcardMatcher.matches(str.toLowerCase(), Text.removeTags(items[i].getName()).toLowerCase())) { + return items[i]; + } + } + return null; + } + + @SneakyThrows + public static int pathLength(NPC npc) { + Field pathLength = npc.getClass().getSuperclass().getDeclaredField(ObfuscatedNames.pathLengthFieldName); + pathLength.setAccessible(true); + int path = pathLength.getInt(npc) * ObfuscatedNames.pathLengthMultiplier; + pathLength.setAccessible(false); + return path; + } + + @SneakyThrows + public static int pathLength(Player player) { + Field pathLength = player.getClass().getSuperclass().getDeclaredField(ObfuscatedNames.pathLengthFieldName); + pathLength.setAccessible(true); + int path = pathLength.getInt(player) * ObfuscatedNames.pathLengthMultiplier; + pathLength.setAccessible(false); + return path; + } + + public static List sceneWorldPoints() { + List allWorldPoints = new ArrayList<>(); + Scene scene = client.getScene(); + Tile[][][] tiles = scene.getTiles(); + int z = client.getPlane(); + for (int x = 0; x < 104; ++x) { + for (int y = 0; y < 104; ++y) { + Tile tile = tiles[z][x][y]; + if (tile == null) { + continue; + } + allWorldPoints.add(tile.getWorldLocation()); + } + } + return allWorldPoints; + } + + public static List reachableTiles() { + boolean[][] visited = new boolean[104][104]; + CollisionData[] collisionData = client.getTopLevelWorldView().getCollisionMaps(); + int[][] flags = collisionData[client.getTopLevelWorldView().getPlane()].getFlags(); + WorldPoint playerLoc = client.getLocalPlayer().getWorldLocation(); + int firstPoint = (playerLoc.getX() - client.getTopLevelWorldView().getBaseX() << 16) | playerLoc.getY() - client.getTopLevelWorldView().getBaseY(); + ArrayDeque queue = new ArrayDeque<>(); + queue.add(firstPoint); + while (!queue.isEmpty()) { + int point = queue.poll(); + short x = (short) (point >> 16); + short y = (short) point; + if ((x - 1) < 0 || (y - 1) < 0 || (x + 1) > 103 || (y + 1) > 103) { + continue; + } + if ((flags[x][y] & CollisionDataFlag.BLOCK_MOVEMENT_SOUTH) == 0 && (flags[x][y - 1] & CollisionDataFlag.BLOCK_MOVEMENT_FULL) == 0 && !visited[x][y - 1]) { + queue.add((x << 16) | (y - 1)); + visited[x][y - 1] = true; + } + if ((flags[x][y] & CollisionDataFlag.BLOCK_MOVEMENT_NORTH) == 0 && (flags[x][y + 1] & CollisionDataFlag.BLOCK_MOVEMENT_FULL) == 0 && !visited[x][y + 1]) { + queue.add((x << 16) | (y + 1)); + visited[x][y + 1] = true; + } + if ((flags[x][y] & CollisionDataFlag.BLOCK_MOVEMENT_WEST) == 0 && (flags[x - 1][y] & CollisionDataFlag.BLOCK_MOVEMENT_FULL) == 0 && !visited[x - 1][y]) { + queue.add(((x - 1) << 16) | y); + visited[x - 1][y] = true; + } + if ((flags[x][y] & CollisionDataFlag.BLOCK_MOVEMENT_EAST) == 0 && (flags[x + 1][y] & CollisionDataFlag.BLOCK_MOVEMENT_FULL) == 0 && !visited[x + 1][y]) { + queue.add(((x + 1) << 16) | y); + visited[x + 1][y] = true; + } + } + int baseX = client.getTopLevelWorldView().getBaseX(); + int baseY = client.getTopLevelWorldView().getBaseY(); + int plane = client.getTopLevelWorldView().getPlane(); + List finalPoints = new ArrayList<>(); + for (int x = 0; x < 104; ++x) { + for (int y = 0; y < 104; ++y) { + if (visited[x][y]) { + finalPoints.add(new WorldPoint(baseX + x, baseY + y, plane)); + } + } + } + return finalPoints; + } + +// public static List reachableTiles() { +// return new ArrayList<>(Arrays.stream(client.getScene().getTiles()).flatMap(Arrays::stream).flatMap(Arrays::stream).filter(Objects::nonNull).filter(x -> canPathToTile(x.getWorldLocation()).isReachable()).map(Tile::getWorldLocation).filter(Objects::nonNull).collect(Collectors.toList())); +// } + + static boolean canMoveWest(int flag) { + return (flag & CollisionDataFlag.BLOCK_MOVEMENT_WEST) != CollisionDataFlag.BLOCK_MOVEMENT_WEST; + } + + static boolean canMoveEast(int flag) { + return (flag & CollisionDataFlag.BLOCK_MOVEMENT_EAST) != CollisionDataFlag.BLOCK_MOVEMENT_EAST; + } + + static boolean canMoveNorth(int flag) { + return (flag & CollisionDataFlag.BLOCK_MOVEMENT_NORTH) != CollisionDataFlag.BLOCK_MOVEMENT_NORTH; + } + + static boolean canMoveSouth(int flag) { + return (flag & CollisionDataFlag.BLOCK_MOVEMENT_SOUTH) != CollisionDataFlag.BLOCK_MOVEMENT_SOUTH; + } + + static boolean canMoveTo(int flag) { + if ((flag & CollisionDataFlag.BLOCK_MOVEMENT_FULL) == CollisionDataFlag.BLOCK_MOVEMENT_FULL) { + return false; + } + if ((flag & CollisionDataFlag.BLOCK_MOVEMENT_FLOOR) == CollisionDataFlag.BLOCK_MOVEMENT_FLOOR) { + return false; + } + if ((flag & CollisionDataFlag.BLOCK_MOVEMENT_OBJECT) == CollisionDataFlag.BLOCK_MOVEMENT_OBJECT) { + return false; + } + return (flag & CollisionDataFlag.BLOCK_MOVEMENT_FLOOR_DECORATION) != CollisionDataFlag.BLOCK_MOVEMENT_FLOOR_DECORATION; + } + + + @Deprecated + public static Widget getItem(int id, WidgetInfo container) { + if (client.getWidget(container) == null) { + return null; + } + Widget[] items = client.getWidget(container).getDynamicChildren(); + for (int i = 0; i < items.length; i++) { + if (items[i].getItemId() == id) { + return items[i]; + } + } + return null; + } + + public int getFirstFreeSlot(WidgetInfo container) { + Widget[] items = client.getWidget(container).getDynamicChildren(); + for (int i = 0; i < items.length; i++) { + if (items[i].getItemId() == 6512) { + return i; + } + } + return -1; + } + + @Deprecated + public int getEmptySlots(WidgetInfo widgetInfo) { + List inventoryItems = Arrays.asList(client.getWidget(widgetInfo.getId()).getDynamicChildren()); + return (int) inventoryItems.stream().filter(item -> item.getItemId() == 6512).count(); + } + + public static boolean isMoving() { + return client.getLocalPlayer().getPoseAnimation() + != client.getLocalPlayer().getIdlePoseAnimation(); + } + + @Deprecated + public TileObject findObject(String objectName) { + ArrayList validObjects = new ArrayList<>(); + for (Tile[][] tile : client.getScene().getTiles()) { + for (Tile[] tiles : tile) { + for (Tile tile1 : tiles) { + if (tile1 == null) { + continue; + } + if (tile1.getGameObjects() == null) { + continue; + } + if (tile1.getGameObjects().length != 0) { + GameObject returnVal = + Arrays.stream(tile1.getGameObjects()).filter(gameObject -> gameObject != null && client.getObjectDefinition(gameObject.getId()).getName().toLowerCase().contains(objectName.toLowerCase())).findFirst().orElse(null); + if (returnVal != null) { + validObjects.add(returnVal); + } + } + } + } + } + if (validObjects.size() > 0) { + return validObjects.stream().sorted(Comparator.comparingInt(x -> x.getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()))).findFirst().orElse(null); + } + return null; + } + + @Deprecated // use client menuAction + @SneakyThrows + public static void invoke(int var0, int var1, int var2, int var3, int var4, int var5, String var6, String var7, int var8, + int var9) { + if (doAction == null) { + Class qtClass = null; + Field classes = ClassLoader.class.getDeclaredField("classes"); + classes.setAccessible(true); + ClassLoader classLoader = client.getClass().getClassLoader(); + Vector> classesVector = (Vector>) classes.get(classLoader); + + for (Class clazz : classesVector) { + if (clazz.getName().equals(ObfuscatedNames.doActionClassName)) { + qtClass = clazz; + break; + } + } + + if (qtClass != null) { + try { + doAction = qtClass.getDeclaredMethod(ObfuscatedNames.doActionMethodName, int.class, int.class, int.class, int.class, int.class, int.class, String.class, String.class, int.class, int.class); + } catch (NoSuchMethodException ignored) { + } + } else { + System.out.println("Cant find doAction"); + return; + } + } + + doAction.setAccessible(true); + doAction.invoke(null, var0, var1, var2, var3, var4, var5, var6, var7, var8, var9, -886112733); + doAction.setAccessible(false); + } + + @Deprecated + public TileObject findObject(int id) { + ArrayList validObjects = new ArrayList<>(); + Arrays.stream(client.getScene().getTiles()).flatMap(Arrays::stream).flatMap(Arrays::stream).filter(Objects::nonNull).filter(tile -> tile.getGameObjects() != null && tile.getGameObjects().length != 0).forEach(tile -> + { + GameObject returnVal = + Arrays.stream(tile.getGameObjects()).filter(gameObject -> gameObject != null && gameObject.getId() == id).findFirst().orElse(null); + if (returnVal != null) { + validObjects.add(returnVal); + } + }); + return validObjects.stream().min(Comparator.comparingInt(x -> x.getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()))).orElse(null); + } + + @Deprecated + public Widget getItemFromList(int[] list, WidgetInfo container) { + for (int i : list) { + Widget item = getItem(i, container); + if (item != null) { + return item; + } + } + return null; + } + + @Deprecated + public int checkIfWearing(int[] ids) { + + if (client.getItemContainer(InventoryID.EQUIPMENT) != null) { + Item[] equipment = client.getItemContainer(InventoryID.EQUIPMENT).getItems(); + for (Item item : equipment) { + for (int id : ids) { + if (id == item.getId()) { + return item.getId(); + } + } + } + } + return -1; + } + + public static PathResult canPathToTile(WorldPoint destinationTile) { + int z = client.getPlane(); + if (z != destinationTile.getPlane()) { + return new PathResult(false, Integer.MAX_VALUE); + } + + CollisionData[] collisionData = client.getCollisionMaps(); + if (collisionData == null) { + return new PathResult(false, Integer.MAX_VALUE); + } + + int[][] directions = new int[128][128]; + int[][] distances = new int[128][128]; + int[] bufferX = new int[4096]; + int[] bufferY = new int[4096]; + + // Initialise directions and distances + for (int i = 0; i < 128; ++i) { + for (int j = 0; j < 128; ++j) { + directions[i][j] = 0; + distances[i][j] = Integer.MAX_VALUE; + } + } + + int pSX = client.getLocalPlayer().getLocalLocation().getSceneX(); + + int pSY = client.getLocalPlayer().getLocalLocation().getSceneY(); + Point p1 = client.getScene().getTiles()[client.getPlane()][pSX][pSY].getSceneLocation(); + LocalPoint lp = LocalPoint.fromWorld(client, destinationTile); + if (lp == null || !lp.isInScene()) { + return new PathResult(false, Integer.MAX_VALUE); + } + Point p2 = new Point(lp.getSceneX(), lp.getSceneY()); + + int middleX = p1.getX(); + int middleY = p1.getY(); + int currentX = middleX; + int currentY = middleY; + int offsetX = 64; + int offsetY = 64; + // Initialise directions and distances for starting tile + directions[offsetX][offsetY] = 99; + distances[offsetX][offsetY] = 0; + int index1 = 0; + bufferX[0] = currentX; + int index2 = 1; + bufferY[0] = currentY; + int[][] collisionDataFlags = collisionData[z].getFlags(); + + int currentDistance = Integer.MAX_VALUE; + boolean isReachable = false; + + while (index1 != index2) { + currentX = bufferX[index1]; + currentY = bufferY[index1]; + index1 = index1 + 1 & 4095; + // currentX is for the local coordinate while currentMapX is for the index in the directions and distances arrays + int currentMapX = currentX - middleX + offsetX; + int currentMapY = currentY - middleY + offsetY; + if ((currentX == p2.getX()) && (currentY == p2.getY())) { + isReachable = true; + break; + } + + currentDistance = distances[currentMapX][currentMapY] + 1; + if (currentMapX > 0 && directions[currentMapX - 1][currentMapY] == 0 && (collisionDataFlags[currentX - 1][currentY] & 19136776) == 0) { + // Able to move 1 tile west + bufferX[index2] = currentX - 1; + bufferY[index2] = currentY; + index2 = index2 + 1 & 4095; + directions[currentMapX - 1][currentMapY] = 2; + distances[currentMapX - 1][currentMapY] = currentDistance; + } + + if (currentMapX < 127 && directions[currentMapX + 1][currentMapY] == 0 && (collisionDataFlags[currentX + 1][currentY] & 19136896) == 0) { + // Able to move 1 tile east + bufferX[index2] = currentX + 1; + bufferY[index2] = currentY; + index2 = index2 + 1 & 4095; + directions[currentMapX + 1][currentMapY] = 8; + distances[currentMapX + 1][currentMapY] = currentDistance; + } + + if (currentMapY > 0 && directions[currentMapX][currentMapY - 1] == 0 && (collisionDataFlags[currentX][currentY - 1] & 19136770) == 0) { + // Able to move 1 tile south + bufferX[index2] = currentX; + bufferY[index2] = currentY - 1; + index2 = index2 + 1 & 4095; + directions[currentMapX][currentMapY - 1] = 1; + distances[currentMapX][currentMapY - 1] = currentDistance; + } + + if (currentMapY < 127 && directions[currentMapX][currentMapY + 1] == 0 && (collisionDataFlags[currentX][currentY + 1] & 19136800) == 0) { + // Able to move 1 tile north + bufferX[index2] = currentX; + bufferY[index2] = currentY + 1; + index2 = index2 + 1 & 4095; + directions[currentMapX][currentMapY + 1] = 4; + distances[currentMapX][currentMapY + 1] = currentDistance; + } + + if (currentMapX > 0 && currentMapY > 0 && directions[currentMapX - 1][currentMapY - 1] == 0 && (collisionDataFlags[currentX - 1][currentY - 1] & 19136782) == 0 && (collisionDataFlags[currentX - 1][currentY] & 19136776) == 0 && (collisionDataFlags[currentX][currentY - 1] & 19136770) == 0) { + // Able to move 1 tile south-west + bufferX[index2] = currentX - 1; + bufferY[index2] = currentY - 1; + index2 = index2 + 1 & 4095; + directions[currentMapX - 1][currentMapY - 1] = 3; + distances[currentMapX - 1][currentMapY - 1] = currentDistance; + } + + if (currentMapX < 127 && currentMapY > 0 && directions[currentMapX + 1][currentMapY - 1] == 0 && (collisionDataFlags[currentX + 1][currentY - 1] & 19136899) == 0 && (collisionDataFlags[currentX + 1][currentY] & 19136896) == 0 && (collisionDataFlags[currentX][currentY - 1] & 19136770) == 0) { + // Able to move 1 tile north-west + bufferX[index2] = currentX + 1; + bufferY[index2] = currentY - 1; + index2 = index2 + 1 & 4095; + directions[currentMapX + 1][currentMapY - 1] = 9; + distances[currentMapX + 1][currentMapY - 1] = currentDistance; + } + + if (currentMapX > 0 && currentMapY < 127 && directions[currentMapX - 1][currentMapY + 1] == 0 && (collisionDataFlags[currentX - 1][currentY + 1] & 19136824) == 0 && (collisionDataFlags[currentX - 1][currentY] & 19136776) == 0 && (collisionDataFlags[currentX][currentY + 1] & 19136800) == 0) { + // Able to move 1 tile south-east + bufferX[index2] = currentX - 1; + bufferY[index2] = currentY + 1; + index2 = index2 + 1 & 4095; + directions[currentMapX - 1][currentMapY + 1] = 6; + distances[currentMapX - 1][currentMapY + 1] = currentDistance; + } + + if (currentMapX < 127 && currentMapY < 127 && directions[currentMapX + 1][currentMapY + 1] == 0 && (collisionDataFlags[currentX + 1][currentY + 1] & 19136992) == 0 && (collisionDataFlags[currentX + 1][currentY] & 19136896) == 0 && (collisionDataFlags[currentX][currentY + 1] & 19136800) == 0) { + // Able to move 1 tile north-east + bufferX[index2] = currentX + 1; + bufferY[index2] = currentY + 1; + index2 = index2 + 1 & 4095; + directions[currentMapX + 1][currentMapY + 1] = 12; + distances[currentMapX + 1][currentMapY + 1] = currentDistance; + } + } + return new PathResult(isReachable, currentDistance); + } + + public static class PathResult { + private final boolean reachable; + private final int distance; + + public PathResult(boolean reachable, int distance) { + this.reachable = reachable; + this.distance = distance; + } + + public boolean isReachable() { + return reachable; + } + + public int getDistance() { + return distance; + } + } + + @SneakyThrows + public static void stopPlugin(Plugin plugin) { + + SwingUtilities.invokeAndWait(() -> + { + try { + pluginManager.stopPlugin(plugin); + pluginManager.setPluginEnabled(plugin, false); + } catch (PluginInstantiationException e) { + throw new RuntimeException(e); + } + }); + } + + public static Client getClient() { + return client; + } + + public static ClientUI getClientUI() { + return clientUI; + } + + + public static List pathToGoalSetFromPlayerUsingReachableTiles(HashSet goalSet, HashSet dangerous, HashSet impassible) { + return pathToGoalSet(goalSet, dangerous, impassible, new HashSet<>(reachableTiles()), playerPosition()); + } + + public static List pathToGoalSetFromPlayerNoCustomTiles(HashSet goalSet) { + return pathToGoalSet(goalSet, EMPTY_SET, EMPTY_SET, new HashSet<>(reachableTiles()), playerPosition()); + } + + public static List pathToGoalFromPlayerUsingCustomDangerous(WorldPoint goal, HashSet dangerous) { + return pathToGoalSet(new HashSet<>(List.of(goal)), dangerous, EMPTY_SET, new HashSet<>(reachableTiles()), playerPosition()); + } + + public static List pathToGoalFromPlayerUsingReachableTiles(WorldPoint goal, HashSet dangerous, HashSet impassible) { + return pathToGoalSet(new HashSet<>(List.of(goal)), dangerous, impassible, new HashSet<>(reachableTiles()), playerPosition()); + } + + public static List pathToGoalFromPlayerNoCustomTiles(WorldPoint goal) { + return pathToGoalSet(new HashSet<>(List.of(goal)), EMPTY_SET, EMPTY_SET, new HashSet<>(reachableTiles()), playerPosition()); + } + + public static List pathToGoalSet(HashSet goalSet, HashSet dangerous, HashSet impassible, HashSet walkable, WorldPoint starting) { + if (Collections.disjoint(goalSet, walkable)) { + return null; + } + ArrayDeque queue = new ArrayDeque(); + HashSet visited = new HashSet<>(); + visited.add(starting); + queue.add(new Node(starting)); + while (!queue.isEmpty()) { + Node current = queue.poll(); + if (goalSet.contains(current.getData())) { + List ret = new ArrayList<>(); + while (current != null) { + ret.add(current.getData()); + current = current.getPrevious(); + } + Collections.reverse(ret); + ret.remove(0); + return ret; + } + for (int[] direction : directionsMap) { + int x = direction[0]; + int y = direction[1]; + if (x == 0 && y == 0) { + continue; + } + WorldPoint currentPoint = current.getData(); + WorldPoint nextPoint = current.getData().dy(y).dx(x); + if (!walkable.contains(nextPoint) || impassible.contains(nextPoint) || dangerous.contains(nextPoint) || visited.contains(nextPoint)) { + continue; + } + if (x == -2 && y == 0) { + if (farWObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Far East + if (x == 2 && y == 0) { + if (farEObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Far South + if (x == 0 && y == -2) { + if (farSObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Far North + if (x == 0 && y == 2) { + if (farNObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //far movements + //L movement in here so i dont get lost in the saauce down there + if (Math.abs(x) + Math.abs(y) == 3) { + //North east + if (x == 1 && y == 2) { + if (northEastLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //East north + if (x == 2 && y == 1) { + if (eastNorthLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //East south + if (x == 2 && y == -1) { + if (eastSouthLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //South east + if (x == 1 && y == -2) { + if (southEastLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //South west + if (x == -1 && y == -2) { + if (southWestLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //West south + if (x == -2 && y == -1) { + if (westSouthLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //West north + if (x == -2 && y == 1) { + if (westNorthLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //North west + if (x == -1 && y == 2) { + if (northWestLObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + } else { + //One tile movement + + //diagonal SE + if (x == 1 && y == -1) { + if (seObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //diagonal NE + if (x == 1 && y == 1) { + if (neObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //diagonal NW + if (x == -1 && y == 1) { + if (nwObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //diagonal SW + if (x == -1 && y == -1) { + if (swObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + + //Two tile movement + + //Diagonal SW + if (x == -2 && y == -2) { + if (farSWObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Diagonal NW + if (x == -2 && y == 2) { + if (farNWObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Diagonal SE + if (x == 2 && y == -2) { + if (farSEObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + //Diagonal NE + if (x == 2 && y == 2) { + if (farNEObstructed(currentPoint, impassible, walkable)) { + continue; + } + visited.add(nextPoint); + queue.add(new Node(nextPoint, current)); + continue; + } + } + } + } + return null; + } + + + static boolean nwObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1)); + } + + public static void sendClientMessage(String message) { + client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", message, null); + } + + static boolean neObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1)); + } + + //L movement of 2 north one east, as opposed to 2 east one north (what should we call this difference?) + static boolean northEastLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(1)) || !walkable.contains(starting.dx(1).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1))) { + return true; + } + return impassible.contains(starting.dx(0).dy(2)) || !walkable.contains(starting.dx(0).dy(2)); + } + + //L movement of 2 east one North, as opposed to 2 north one east + static boolean eastNorthLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(1)) || !walkable.contains(starting.dx(1).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(2).dy(0)) || !walkable.contains(starting.dx(2).dy(0)); + } + + static boolean eastSouthLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(-1)) || !walkable.contains(starting.dx(1).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(2).dy(0)) || !walkable.contains(starting.dx(2).dy(0)); + } + + static boolean southEastLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(-1)) || !walkable.contains(starting.dx(1).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1))) { + return true; + } + return impassible.contains(starting.dx(0).dy(-2)) || !walkable.contains(starting.dx(0).dy(-2)); + } + + static boolean southWestLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(-1)) || !walkable.contains(starting.dx(-1).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1))) { + return true; + } + return impassible.contains(starting.dx(0).dy(-2)) || !walkable.contains(starting.dx(0).dy(-2)); + } + + static boolean westSouthLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(-1)) || !walkable.contains(starting.dx(-1).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(-2).dy(0)) || !walkable.contains(starting.dx(-2).dy(0)); + } + + static boolean westNorthLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(1)) || !walkable.contains(starting.dx(-1).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(-2).dy(0)) || !walkable.contains(starting.dx(-2).dy(0)); + } + + static boolean northWestLObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(1)) || !walkable.contains(starting.dx(-1).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1))) { + return true; + } + return impassible.contains(starting.dx(0).dy(2)) || !walkable.contains(starting.dx(0).dy(2)); + } + + static boolean seObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1)); + } + + static boolean swObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1)); + } + + static boolean farNObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + return impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1)); + } + + static boolean farSObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + return impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1)); + } + + static boolean farEObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + return impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0)); + } + + static boolean farWObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + return impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0)); + } + + static boolean farSWObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(-2)) || !walkable.contains(starting.dx(-1).dy(-2))) { + return true; + } + if (impassible.contains(starting.dx(-2).dy(-1)) || !walkable.contains(starting.dx(-2).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(-1).dy(-1)) || !walkable.contains(starting.dx(-1).dy(-1)); + } + + static boolean farNWObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(-1).dy(2)) || !walkable.contains(starting.dx(-1).dy(2))) { + return true; + } + if (impassible.contains(starting.dx(-2).dy(1)) || !walkable.contains(starting.dx(-2).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(-1).dy(0)) || !walkable.contains(starting.dx(-1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(-1).dy(1)) || !walkable.contains(starting.dx(-1).dy(1)); + } + + static boolean farNEObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(2)) || !walkable.contains(starting.dx(1).dy(2))) { + return true; + } + if (impassible.contains(starting.dx(2).dy(1)) || !walkable.contains(starting.dx(2).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(1)) || !walkable.contains(starting.dx(0).dy(1))) { + return true; + } + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(1).dy(1)) || !walkable.contains(starting.dx(1).dy(1)); + } + + static boolean farSEObstructed(WorldPoint starting, HashSet impassible, HashSet walkable) { + if (impassible.contains(starting.dx(1).dy(-2)) || !walkable.contains(starting.dx(1).dy(-2))) { + return true; + } + if (impassible.contains(starting.dx(2).dy(-1)) || !walkable.contains(starting.dx(2).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(0).dy(-1)) || !walkable.contains(starting.dx(0).dy(-1))) { + return true; + } + if (impassible.contains(starting.dx(1).dy(0)) || !walkable.contains(starting.dx(1).dy(0))) { + return true; + } + return impassible.contains(starting.dx(1).dy(-1)) || !walkable.contains(starting.dx(1).dy(-1)); + } + + @Override + public void startUp() throws Exception { + eventBus.register(RuneLite.getInjector().getInstance(Inventory.class)); + eventBus.register(RuneLite.getInjector().getInstance(Bank.class)); + eventBus.register(RuneLite.getInjector().getInstance(BankInventory.class)); + eventBus.register(RuneLite.getInjector().getInstance(NPCs.class)); + eventBus.register(RuneLite.getInjector().getInstance(TileObjects.class)); + eventBus.register(RuneLite.getInjector().getInstance(Players.class)); + eventBus.register(RuneLite.getInjector().getInstance(Equipment.class)); + eventBus.register(RuneLite.getInjector().getInstance(DepositBox.class)); + eventBus.register(RuneLite.getInjector().getInstance(ShopInventory.class)); + eventBus.register(RuneLite.getInjector().getInstance(Shop.class)); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Bank.java b/src/main/java/ee/futur/baseapi/collections/Bank.java new file mode 100644 index 0000000..f0c82c7 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Bank.java @@ -0,0 +1,82 @@ +package ee.futur.baseapi.collections; + + +import ee.futur.baseapi.collections.query.ItemQuery; +import ee.futur.baseapi.BaseApiPlugin; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +public class Bank { + private static final int WITHDRAW_MODE = 3958; + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List bankItems = new ArrayList<>(); + boolean bankUpdate = true; + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + Bank.bankItems.clear(); + int i = 0; + if (client.getItemContainer(InventoryID.BANK) == null) { + return new ItemQuery(new ArrayList<>()); + } + for (Item item : client.getItemContainer(InventoryID.BANK).getItems()) { + try { + if (item == null) { + i++; + continue; + } + if (BaseApiPlugin.itemDefs.get(item.getId()).getPlaceholderTemplateId() == 14401) { + i++; + continue; + } + Bank.bankItems.add(new BankItemWidget(BaseApiPlugin.itemDefs.get(item.getId()).getName(), item.getId(), item.getQuantity(), i)); + } catch (NullPointerException | ExecutionException ex) { + //todo fix this + } + i++; + } + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(bankItems.stream().filter(Objects::nonNull).collect(Collectors.toList())); + } + + public static boolean isOpen() { + return client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER) != null && !client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER).isHidden(); + } + + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + Bank.bankItems.clear(); + } + } + + public static boolean isNotedMode() { + return client.getVarbitValue(WITHDRAW_MODE) == 1; + } + + public static void setWithdrawMode(boolean noted) { + if (noted && !isNotedMode()) { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetActionPacket(1, 786458, -1, -1); + } else if (!noted && isNotedMode()) { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetActionPacket(1, 786456, -1, -1); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/BankInventory.java b/src/main/java/ee/futur/baseapi/collections/BankInventory.java new file mode 100644 index 0000000..a43abf5 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/BankInventory.java @@ -0,0 +1,41 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class BankInventory { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List bankInventoryItems = new ArrayList<>(); + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + if (client.getWidget(WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER) == null) { + return new ItemQuery(new ArrayList<>()); + } + BankInventory.bankInventoryItems = + Arrays.stream(client.getWidget(WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(bankInventoryItems.stream().filter(Objects::nonNull).collect(Collectors.toList())); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + BankInventory.bankInventoryItems.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/BankItemWidget.java b/src/main/java/ee/futur/baseapi/collections/BankItemWidget.java new file mode 100644 index 0000000..0f871c8 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/BankItemWidget.java @@ -0,0 +1,882 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.BaseApiPlugin; +import net.runelite.api.FontTypeFace; +import net.runelite.api.Point; +import net.runelite.api.gameval.VarbitID; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; + +import javax.annotation.Nullable; +import java.awt.*; + +public class BankItemWidget implements Widget { + + int index; + String name; + int itemid; + int quantity; + + BankItemWidget(String name, int itemid, int quantity, int index) { + this.name = name; + this.itemid = itemid; + this.quantity = quantity; + this.index = index; + } + + @Override + public int getId() { + return WidgetInfo.BANK_ITEM_CONTAINER.getPackedId(); + } + + @Override + public int getType() { + return 0; + } + + @Override + public void setType(int type) { + + } + + @Override + public void clearActions() { + } + + ; + + @Override + public int getContentType() { + return 0; + } + + @Override + public Widget setContentType(int contentType) { + return null; + } + + @Override + public int getClickMask() { + return 0; + } + + @Override + public Widget setClickMask(int mask) { + return null; + } + + @Override + public Widget getParent() { + return null; + } + + @Override + public int getParentId() { + return 0; + } + + @Override + public Widget getChild(int index) { + return null; + } + + @Nullable + @Override + public Widget[] getChildren() { + return new Widget[0]; + } + + @Override + public void setChildren(Widget[] children) { + + } + + @Override + public Widget[] getDynamicChildren() { + return new Widget[0]; + } + + @Override + public Widget[] getStaticChildren() { + return new Widget[0]; + } + + @Override + public Widget[] getNestedChildren() { + return new Widget[0]; + } + + @Override + public int getRelativeX() { + return 0; + } + + @Override + public void setRelativeX(int x) { + + } + + @Override + public int getRelativeY() { + return 0; + } + + @Override + public void setRelativeY(int y) { + + } + + @Override + public void setForcedPosition(int x, int y) { + + } + + @Override + public String getText() { + return null; + } + + @Override + public Widget setText(String text) { + return null; + } + + @Override + public int getTextColor() { + return 0; + } + + @Override + public Widget setTextColor(int textColor) { + return null; + } + + @Override + public int getOpacity() { + return 0; + } + + @Override + public Widget setOpacity(int transparency) { + return null; + } + + @Override + public String getName() { + return name; + } + + @Override + public Widget setName(String name) { + return null; + } + + @Override + public int getModelId() { + return 0; + } + + @Override + public Widget setModelId(int id) { + return null; + } + + @Override + public int getModelType() { + return 0; + } + + @Override + public Widget setModelType(int type) { + return null; + } + + @Override + public int getAnimationId() { + return 0; + } + + @Override + public Widget setAnimationId(int animationId) { + return null; + } + + @Override + public int getRotationX() { + return 0; + } + + @Override + public Widget setRotationX(int modelX) { + return null; + } + + @Override + public int getRotationY() { + return 0; + } + + @Override + public Widget setRotationY(int modelY) { + return null; + } + + @Override + public int getRotationZ() { + return 0; + } + + @Override + public Widget setRotationZ(int modelZ) { + return null; + } + + @Override + public int getModelZoom() { + return 0; + } + + @Override + public Widget setModelZoom(int modelZoom) { + return null; + } + + @Override + public int getSpriteId() { + return 0; + } + + @Override + public boolean getSpriteTiling() { + return false; + } + + @Override + public Widget setSpriteTiling(boolean tiling) { + return null; + } + + @Override + public Widget setSpriteId(int spriteId) { + return null; + } + + @Override + public boolean isHidden() { + return false; + } + + @Override + public boolean isSelfHidden() { + return false; + } + + @Override + public Widget setHidden(boolean hidden) { + return null; + } + + @Override + public int getIndex() { + return index; + } + + @Override + public Point getCanvasLocation() { + return null; + } + + @Override + public int getWidth() { + return 0; + } + + @Override + public void setWidth(int width) { + + } + + @Override + public int getHeight() { + return 0; + } + + @Override + public void setHeight(int height) { + + } + + @Override + public Rectangle getBounds() { + return null; + } + + @Override + public int getItemId() { + return itemid; + } + + @Override + public Widget setItemId(int itemId) { + return null; + } + + @Override + public int getItemQuantity() { + return quantity; + } + + @Override + public Widget setItemQuantity(int quantity) { + return null; + } + + @Override + public boolean contains(Point point) { + return false; + } + + @Override + public int getScrollX() { + return 0; + } + + @Override + public Widget setScrollX(int scrollX) { + return null; + } + + @Override + public int getScrollY() { + return 0; + } + + @Override + public Widget setScrollY(int scrollY) { + return null; + } + + @Override + public int getScrollWidth() { + return 0; + } + + @Override + public Widget setScrollWidth(int width) { + return null; + } + + @Override + public int getScrollHeight() { + return 0; + } + + @Override + public Widget setScrollHeight(int height) { + return null; + } + + @Override + public int getOriginalX() { + return 0; + } + + @Override + public Widget setOriginalX(int originalX) { + return null; + } + + @Override + public int getOriginalY() { + return 0; + } + + @Override + public Widget setOriginalY(int originalY) { + return null; + } + + @Override + public Widget setPos(int x, int y) { + return null; + } + + @Override + public Widget setPos(int x, int y, int xMode, int yMode) { + return null; + } + + @Override + public int getOriginalHeight() { + return 0; + } + + @Override + public Widget setOriginalHeight(int originalHeight) { + return null; + } + + @Override + public int getOriginalWidth() { + return 0; + } + + @Override + public Widget setOriginalWidth(int originalWidth) { + return null; + } + + @Override + public Widget setSize(int width, int height) { + return null; + } + + @Override + public Widget setSize(int width, int height, int widthMode, int heightMode) { + return null; + } + + @Nullable + @Override + public String[] getActions() { + int xQuantity = BaseApiPlugin.getClient().getVarbitValue(VarbitID.BANK_REQUESTEDQUANTITY); + String[] actions = new String[10]; + switch (BaseApiPlugin.getClient().getVarbitValue(VarbitID.BANK_QUANTITY_TYPE)) { + default: + case 0: + actions[0] = "Withdraw-1"; + actions[1] = "Withdraw-5"; + actions[2] = "Withdraw-10"; + if (xQuantity > 0) { + actions[3] = "Withdraw-" + xQuantity; + actions[4] = "Withdraw-X"; + actions[5] = "Withdraw-All"; + actions[6] = "Withdraw-All-but-1"; + } else { + actions[3] = "Withdraw-X"; + actions[4] = "Withdraw-All"; + actions[5] = "Withdraw-All-but-1"; + } + break; + case 1: + actions[0] = "Withdraw-5"; + actions[1] = "Withdraw-1"; + actions[2] = "Withdraw-10"; + if (xQuantity > 0) { + actions[3] = "Withdraw-" + xQuantity; + actions[4] = "Withdraw-X"; + actions[5] = "Withdraw-All"; + actions[6] = "Withdraw-All-but-1"; + } else { + actions[3] = "Withdraw-X"; + actions[4] = "Withdraw-All"; + actions[5] = "Withdraw-All-but-1"; + } + break; + case 2: + actions[0] = "Withdraw-10"; + actions[1] = "Withdraw-1"; + actions[2] = "Withdraw-5"; + if (xQuantity > 0) { + actions[3] = "Withdraw-" + xQuantity; + actions[4] = "Withdraw-X"; + actions[5] = "Withdraw-All"; + actions[6] = "Withdraw-All-but-1"; + } else { + actions[3] = "Withdraw-X"; + actions[4] = "Withdraw-All"; + actions[5] = "Withdraw-All-but-1"; + } + break; + case 3: + // this can't ever be a thing while this is set to 0 + actions[0] = "Withdraw-" + xQuantity; + actions[1] = "Withdraw-1"; + actions[2] = "Withdraw-5"; + actions[3] = "Withdraw-10"; + actions[4] = "Withdraw-X"; + actions[5] = "Withdraw-All"; + actions[6] = "Withdraw-All-but-1"; + break; + case 4: + actions[0] = "Withdraw-All"; + actions[1] = "Withdraw-1"; + actions[2] = "Withdraw-5"; + actions[3] = "Withdraw-10"; + if (xQuantity > 0) { + actions[4] = "Withdraw-" + xQuantity; + actions[5] = "Withdraw-X"; + actions[6] = "Withdraw-All-but-1"; + } else { + actions[4] = "Withdraw-X"; + actions[5] = "Withdraw-All-but-1"; + } + break; + } + + if (BaseApiPlugin.getClient().getVarbitValue(VarbitID.BANK_LEAVEPLACEHOLDERS) == 0) { + actions[7] = "Placeholder"; + } + // these are null normally, 7 can be placeholder + // actions[7] = null; + // actions[8] = null; + + actions[9] = "Examine"; + return actions; + } + + @Override + public Widget createChild(int index, int type) { + return null; + } + + @Override + public Widget createChild(int type) { + return null; + } + + @Override + public void deleteAllChildren() { + + } + + @Override + public void setAction(int index, String action) { + + } + + @Override + public void setOnOpListener(Object... args) { + + } + + @Override + public void setOnDialogAbortListener(Object... args) { + + } + + @Override + public void setOnKeyListener(Object... args) { + + } + + @Override + public void setOnMouseOverListener(Object... args) { + + } + + @Override + public void setOnMouseRepeatListener(Object... args) { + + } + + @Override + public void setOnMouseLeaveListener(Object... args) { + + } + + @Override + public void setOnTimerListener(Object... args) { + + } + + @Override + public void setOnTargetEnterListener(Object... args) { + + } + + @Override + public void setOnTargetLeaveListener(Object... args) { + + } + + @Override + public boolean hasListener() { + return false; + } + + @Override + public Widget setHasListener(boolean hasListener) { + return null; + } + + @Override + public boolean isIf3() { + return false; + } + + @Override + public void revalidate() { + + } + + @Override + public void revalidateScroll() { + + } + + @Override + public Object[] getOnOpListener() { + return new Object[0]; + } + + @Override + public Object[] getOnKeyListener() { + return new Object[0]; + } + + @Override + public Object[] getOnLoadListener() { + return new Object[0]; + } + + @Override + public Object[] getOnInvTransmitListener() { + return new Object[0]; + } + + @Override + public int getFontId() { + return 0; + } + + @Override + public Widget setFontId(int id) { + return null; + } + + @Override + public int getBorderType() { + return 0; + } + + @Override + public void setBorderType(int thickness) { + + } + + @Override + public boolean getTextShadowed() { + return false; + } + + @Override + public Widget setTextShadowed(boolean shadowed) { + return null; + } + + @Override + public int getDragDeadZone() { + return 0; + } + + @Override + public void setDragDeadZone(int deadZone) { + + } + + @Override + public int getDragDeadTime() { + return 0; + } + + @Override + public void setDragDeadTime(int deadTime) { + + } + + @Override + public int getItemQuantityMode() { + return 0; + } + + @Override + public Widget setItemQuantityMode(int itemQuantityMode) { + return null; + } + + @Override + public int getXPositionMode() { + return 0; + } + + @Override + public Widget setXPositionMode(int xpm) { + return null; + } + + @Override + public int getYPositionMode() { + return 0; + } + + @Override + public Widget setYPositionMode(int ypm) { + return null; + } + + @Override + public int getLineHeight() { + return 0; + } + + @Override + public Widget setLineHeight(int lineHeight) { + return null; + } + + @Override + public int getXTextAlignment() { + return 0; + } + + @Override + public Widget setXTextAlignment(int xta) { + return null; + } + + @Override + public int getYTextAlignment() { + return 0; + } + + @Override + public Widget setYTextAlignment(int yta) { + return null; + } + + @Override + public int getWidthMode() { + return 0; + } + + @Override + public Widget setWidthMode(int widthMode) { + return null; + } + + @Override + public int getHeightMode() { + return 0; + } + + @Override + public Widget setHeightMode(int heightMode) { + return null; + } + + @Override + public FontTypeFace getFont() { + return null; + } + + @Override + public boolean isFilled() { + return false; + } + + @Override + public Widget setFilled(boolean filled) { + return null; + } + + @Override + public String getTargetVerb() { + return null; + } + + @Override + public void setTargetVerb(String targetVerb) { + + } + + @Override + public int getTargetPriority() { + return 0; + } + + @Override + public void setTargetPriority(int priority) { + + } + + @Override + public boolean getNoClickThrough() { + return false; + } + + @Override + public void setNoClickThrough(boolean noClickThrough) { + + } + + @Override + public boolean getNoScrollThrough() { + return false; + } + + @Override + public void setNoScrollThrough(boolean noScrollThrough) { + + } + + @Override + public int[] getVarTransmitTrigger() { + return null; + } + + @Override + public void setVarTransmitTrigger(int... trigger) { + + } + + @Override + public void setOnClickListener(Object... args) { + + } + + @Override + public void setOnHoldListener(Object... args) { + + } + + @Override + public void setOnReleaseListener(Object... args) { + + } + + @Override + public void setOnDragCompleteListener(Object... args) { + + } + + @Override + public void setOnDragListener(Object... args) { + + } + + @Override + public void setOnScrollWheelListener(Object... args) { + + } + + @Override + public Widget getDragParent() { + return null; + } + + @Override + public Widget setDragParent(Widget dragParent) { + return null; + } + + @Override + public Object[] getOnVarTransmitListener() { + return new Object[0]; + } + + @Override + public void setOnVarTransmitListener(Object... args) { + + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/DepositBox.java b/src/main/java/ee/futur/baseapi/collections/DepositBox.java new file mode 100644 index 0000000..1e463a7 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/DepositBox.java @@ -0,0 +1,68 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class DepositBox { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List depositBoxItems = new ArrayList<>(); + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + DepositBox.depositBoxItems = + Arrays.stream(client.getWidget(WidgetInfo.DEPOSIT_BOX_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(depositBoxItems); + } + +// @Subscribe +// public void onWidgetLoaded(WidgetLoaded e) { +// if (e.getGroupId() == WidgetID.DEPOSIT_BOX_GROUP_ID) { +// try { +// DepositBox.depositBoxItems = +// Arrays.stream(client.getWidget(WidgetInfo.DEPOSIT_BOX_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// } catch (NullPointerException err) { +// DepositBox.depositBoxItems.clear(); +// } +// } +// } + +// @Subscribe +// public void onItemContainerChanged(ItemContainerChanged e) { +// if (e.getContainerId() == 93) { +// if (client.getWidget(WidgetInfo.DEPOSIT_BOX_INVENTORY_ITEMS_CONTAINER) == null) { +// DepositBox.depositBoxItems.clear(); +// return; +// } +// try { +// DepositBox.depositBoxItems = +// Arrays.stream(client.getWidget(WidgetInfo.DEPOSIT_BOX_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// return; +// } catch (NullPointerException err) { +// DepositBox.depositBoxItems.clear(); +// return; +// } +// } +// } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + DepositBox.depositBoxItems.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/ETileItem.java b/src/main/java/ee/futur/baseapi/collections/ETileItem.java new file mode 100644 index 0000000..6f44902 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/ETileItem.java @@ -0,0 +1,34 @@ +package ee.futur.baseapi.collections; + +import net.runelite.api.TileItem; +import net.runelite.api.coords.WorldPoint; + +import static net.runelite.api.TileItem.OWNERSHIP_GROUP; +import static net.runelite.api.TileItem.OWNERSHIP_SELF; + +public class ETileItem { + public WorldPoint location; + public TileItem tileItem; + + public ETileItem(WorldPoint worldLocation, TileItem tileItem) { + this.location = worldLocation; + this.tileItem = tileItem; + } + + public WorldPoint getLocation() { + return location; + } + + public TileItem getTileItem() { + return tileItem; + } + + public boolean isMine() { + return tileItem.getOwnership() == OWNERSHIP_SELF || tileItem.getOwnership() == OWNERSHIP_GROUP; + } + + public void interact(boolean ctrlDown) { + //MousePackets.queueClickPacket(); + //TileItemPackets.queueTileItemAction(this, ctrlDown); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Equipment.java b/src/main/java/ee/futur/baseapi/collections/Equipment.java new file mode 100644 index 0000000..fae69a0 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Equipment.java @@ -0,0 +1,105 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.EquipmentItemQuery; +import net.runelite.api.Client; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Equipment { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List equipment = new ArrayList<>(); + static HashMap equipmentSlotWidgetMapping = new HashMap<>(); + static HashMap mappingToIterableIntegers = new HashMap<>(); + static int lastUpdateTick = 0; + + static { + equipmentSlotWidgetMapping.put(0, 15); + equipmentSlotWidgetMapping.put(1, 16); + equipmentSlotWidgetMapping.put(2, 17); + equipmentSlotWidgetMapping.put(3, 18); + equipmentSlotWidgetMapping.put(4, 19); + equipmentSlotWidgetMapping.put(5, 20); + equipmentSlotWidgetMapping.put(7, 21); + equipmentSlotWidgetMapping.put(9, 22); + equipmentSlotWidgetMapping.put(10, 23); + equipmentSlotWidgetMapping.put(12, 24); + equipmentSlotWidgetMapping.put(13, 25); + + + mappingToIterableIntegers.put(0, 0); + mappingToIterableIntegers.put(1, 1); + mappingToIterableIntegers.put(2, 2); + mappingToIterableIntegers.put(3, 3); + mappingToIterableIntegers.put(4, 4); + mappingToIterableIntegers.put(5, 5); + mappingToIterableIntegers.put(6, 7); + mappingToIterableIntegers.put(7, 9); + mappingToIterableIntegers.put(8, 10); + mappingToIterableIntegers.put(9, 12); + mappingToIterableIntegers.put(10, 13); + } + + public static EquipmentItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + int x = 25362447; + for (int i = 0; i < 11; i++) { + client.runScript(545, (x + i), mappingToIterableIntegers.get(i), 1, 1, 2); + } + equipment.clear(); + int i = -1; + if (client.getItemContainer(InventoryID.EQUIPMENT.getId()) == null) { + return new EquipmentItemQuery(equipment); + } + for (Item item : client.getItemContainer(InventoryID.EQUIPMENT.getId()).getItems()) { + i++; + if (item == null) { + continue; + } + if (item.getId() == 6512 || item.getId() == -1) { + continue; + } + Widget w = client.getWidget(WidgetInfo.EQUIPMENT.getGroupId(), equipmentSlotWidgetMapping.get(i)); + if (w == null || w.getActions() == null) { + continue; + } + equipment.add(new EquipmentItemWidget(w.getName(), item.getId(), w.getId(), -1, w.getActions())); + } + lastUpdateTick = client.getTickCount(); + } + return new EquipmentItemQuery(equipment); + } + +// @SneakyThrows +// @Subscribe +// public void onItemContainerChanged(ItemContainerChanged e) { +// if (e.getContainerId() == InventoryID.EQUIPMENT.getId()) { +// int x = 25362447; +// for (int i = 0; i < 11; i++) { +// client.runScript(545, (x + i), mappingToIterableIntegers.get(i), 1, 1, 2); +// } +// equipment.clear(); +// int i = -1; +// for (Item item : e.getItemContainer().getItems()) { +// i++; +// if (item == null) { +// continue; +// } +// if (item.getId() == 6512 || item.getId() == -1) { +// continue; +// } +// Widget w = client.getWidget(WidgetInfo.EQUIPMENT.getGroupId(), equipmentSlotWidgetMapping.get(i)); +// if (w == null || w.getActions() == null) { +// continue; +// } +// equipment.add(new EquipmentItemWidget(w.getName(), item.getId(), w.getId(), i, w.getActions())); +// } +// } +// } +} diff --git a/src/main/java/ee/futur/baseapi/collections/EquipmentItemWidget.java b/src/main/java/ee/futur/baseapi/collections/EquipmentItemWidget.java new file mode 100644 index 0000000..6b02386 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/EquipmentItemWidget.java @@ -0,0 +1,812 @@ +package ee.futur.baseapi.collections; + +import net.runelite.api.FontTypeFace; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; + +import javax.annotation.Nullable; +import java.awt.*; + +public class EquipmentItemWidget implements Widget { + String name; + String[] actions; + int packedId; + static final int EQUIPMENT_INVENTORY_ITEMS_CONTAINER = 25362449; + int equipmentItemId; + int index; + + EquipmentItemWidget(String name, int itemId, int packedId, int index, String[] actions) { + this.equipmentItemId = itemId; + this.name = name; + this.actions = actions; + this.packedId = packedId; + this.index = index; + } + + + public void interact(String... actions) { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetAction(BaseApiPlugin.getClient().getWidget(packedId), actions); + } + + public int getEquipmentItemId() { + return equipmentItemId; + } + + public int getEquipmentIndex() { + return index; + } + + @Override + public int getId() { + return packedId; + } + + @Override + public int getType() { + return 0; + } + + @Override + public void setType(int type) { + + } + + @Override + public void clearActions() { + } + + ; + + @Override + public int getContentType() { + return 0; + } + + @Override + public Widget setContentType(int contentType) { + return null; + } + + @Override + public int getClickMask() { + return 0; + } + + @Override + public Widget setClickMask(int mask) { + return null; + } + + @Override + public Widget getParent() { + return null; + } + + @Override + public int getParentId() { + return 0; + } + + @Override + public Widget getChild(int index) { + return null; + } + + @Nullable + @Override + public Widget[] getChildren() { + return new Widget[0]; + } + + @Override + public void setChildren(Widget[] children) { + + } + + @Override + public Widget[] getDynamicChildren() { + return new Widget[0]; + } + + @Override + public Widget[] getStaticChildren() { + return new Widget[0]; + } + + @Override + public Widget[] getNestedChildren() { + return new Widget[0]; + } + + @Override + public int getRelativeX() { + return 0; + } + + @Override + public void setRelativeX(int x) { + + } + + @Override + public int getRelativeY() { + return 0; + } + + @Override + public void setRelativeY(int y) { + + } + + @Override + public void setForcedPosition(int x, int y) { + + } + + @Override + public String getText() { + return null; + } + + @Override + public Widget setText(String text) { + return null; + } + + @Override + public int getTextColor() { + return 0; + } + + @Override + public Widget setTextColor(int textColor) { + return null; + } + + @Override + public int getOpacity() { + return 0; + } + + @Override + public Widget setOpacity(int transparency) { + return null; + } + + @Override + public String getName() { + return name; + } + + @Override + public Widget setName(String name) { + return null; + } + + @Override + public int getModelId() { + return 0; + } + + @Override + public Widget setModelId(int id) { + return null; + } + + @Override + public int getModelType() { + return 0; + } + + @Override + public Widget setModelType(int type) { + return null; + } + + @Override + public int getAnimationId() { + return 0; + } + + @Override + public Widget setAnimationId(int animationId) { + return null; + } + + @Override + public int getRotationX() { + return 0; + } + + @Override + public Widget setRotationX(int modelX) { + return null; + } + + @Override + public int getRotationY() { + return 0; + } + + @Override + public Widget setRotationY(int modelY) { + return null; + } + + @Override + public int getRotationZ() { + return 0; + } + + @Override + public Widget setRotationZ(int modelZ) { + return null; + } + + @Override + public int getModelZoom() { + return 0; + } + + @Override + public Widget setModelZoom(int modelZoom) { + return null; + } + + @Override + public int getSpriteId() { + return 0; + } + + @Override + public boolean getSpriteTiling() { + return false; + } + + @Override + public Widget setSpriteTiling(boolean tiling) { + return null; + } + + @Override + public Widget setSpriteId(int spriteId) { + return null; + } + + @Override + public boolean isHidden() { + return false; + } + + @Override + public boolean isSelfHidden() { + return false; + } + + @Override + public Widget setHidden(boolean hidden) { + return null; + } + + @Override + public int getIndex() { + return index; + } + + @Override + public Point getCanvasLocation() { + return null; + } + + @Override + public int getWidth() { + return 0; + } + + @Override + public void setWidth(int width) { + + } + + @Override + public int getHeight() { + return 0; + } + + @Override + public void setHeight(int height) { + + } + + @Override + public Rectangle getBounds() { + return null; + } + + @Override + public int getItemId() { + return equipmentItemId; + } + + @Override + public Widget setItemId(int itemId) { + return null; + } + + @Override + public int getItemQuantity() { + return 1; + } + + @Override + public Widget setItemQuantity(int quantity) { + return null; + } + + @Override + public boolean contains(Point point) { + return false; + } + + @Override + public int getScrollX() { + return 0; + } + + @Override + public Widget setScrollX(int scrollX) { + return null; + } + + @Override + public int getScrollY() { + return 0; + } + + @Override + public Widget setScrollY(int scrollY) { + return null; + } + + @Override + public int getScrollWidth() { + return 0; + } + + @Override + public Widget setScrollWidth(int width) { + return null; + } + + @Override + public int getScrollHeight() { + return 0; + } + + @Override + public Widget setScrollHeight(int height) { + return null; + } + + @Override + public int getOriginalX() { + return 0; + } + + @Override + public Widget setOriginalX(int originalX) { + return null; + } + + @Override + public int getOriginalY() { + return 0; + } + + @Override + public Widget setOriginalY(int originalY) { + return null; + } + + @Override + public Widget setPos(int x, int y) { + return null; + } + + @Override + public Widget setPos(int x, int y, int xMode, int yMode) { + return null; + } + + @Override + public int getOriginalHeight() { + return 0; + } + + @Override + public Widget setOriginalHeight(int originalHeight) { + return null; + } + + @Override + public int getOriginalWidth() { + return 0; + } + + @Override + public Widget setOriginalWidth(int originalWidth) { + return null; + } + + @Override + public Widget setSize(int width, int height) { + return null; + } + + @Override + public Widget setSize(int width, int height, int widthMode, int heightMode) { + return null; + } + + @Nullable + @Override + public String[] getActions() { + return actions; + } + + @Override + public Widget createChild(int index, int type) { + return null; + } + + @Override + public Widget createChild(int type) { + return null; + } + + @Override + public void deleteAllChildren() { + + } + + @Override + public void setAction(int index, String action) { + + } + + @Override + public void setOnOpListener(Object... args) { + + } + + @Override + public void setOnDialogAbortListener(Object... args) { + + } + + @Override + public void setOnKeyListener(Object... args) { + + } + + @Override + public void setOnMouseOverListener(Object... args) { + + } + + @Override + public void setOnMouseRepeatListener(Object... args) { + + } + + @Override + public void setOnMouseLeaveListener(Object... args) { + + } + + @Override + public void setOnTimerListener(Object... args) { + + } + + @Override + public void setOnTargetEnterListener(Object... args) { + + } + + @Override + public void setOnTargetLeaveListener(Object... args) { + + } + + @Override + public boolean hasListener() { + return false; + } + + @Override + public Widget setHasListener(boolean hasListener) { + return null; + } + + @Override + public boolean isIf3() { + return false; + } + + @Override + public void revalidate() { + + } + + @Override + public void revalidateScroll() { + + } + + @Override + public Object[] getOnOpListener() { + return new Object[0]; + } + + @Override + public Object[] getOnKeyListener() { + return new Object[0]; + } + + @Override + public Object[] getOnLoadListener() { + return new Object[0]; + } + + @Override + public Object[] getOnInvTransmitListener() { + return new Object[0]; + } + + @Override + public int getFontId() { + return 0; + } + + @Override + public Widget setFontId(int id) { + return null; + } + + @Override + public int getBorderType() { + return 0; + } + + @Override + public void setBorderType(int thickness) { + + } + + @Override + public boolean getTextShadowed() { + return false; + } + + @Override + public Widget setTextShadowed(boolean shadowed) { + return null; + } + + @Override + public int getDragDeadZone() { + return 0; + } + + @Override + public void setDragDeadZone(int deadZone) { + + } + + @Override + public int getDragDeadTime() { + return 0; + } + + @Override + public void setDragDeadTime(int deadTime) { + + } + + @Override + public int getItemQuantityMode() { + return 0; + } + + @Override + public Widget setItemQuantityMode(int itemQuantityMode) { + return null; + } + + @Override + public int getXPositionMode() { + return 0; + } + + @Override + public Widget setXPositionMode(int xpm) { + return null; + } + + @Override + public int getYPositionMode() { + return 0; + } + + @Override + public Widget setYPositionMode(int ypm) { + return null; + } + + @Override + public int getLineHeight() { + return 0; + } + + @Override + public Widget setLineHeight(int lineHeight) { + return null; + } + + @Override + public int getXTextAlignment() { + return 0; + } + + @Override + public Widget setXTextAlignment(int xta) { + return null; + } + + @Override + public int getYTextAlignment() { + return 0; + } + + @Override + public Widget setYTextAlignment(int yta) { + return null; + } + + @Override + public int getWidthMode() { + return 0; + } + + @Override + public Widget setWidthMode(int widthMode) { + return null; + } + + @Override + public int getHeightMode() { + return 0; + } + + @Override + public Widget setHeightMode(int heightMode) { + return null; + } + + @Override + public FontTypeFace getFont() { + return null; + } + + @Override + public boolean isFilled() { + return false; + } + + @Override + public Widget setFilled(boolean filled) { + return null; + } + + @Override + public String getTargetVerb() { + return null; + } + + @Override + public void setTargetVerb(String targetVerb) { + + } + + @Override + public int getTargetPriority() { + return 0; + } + + @Override + public void setTargetPriority(int priority) { + + } + + @Override + public boolean getNoClickThrough() { + return false; + } + + @Override + public void setNoClickThrough(boolean noClickThrough) { + + } + + @Override + public boolean getNoScrollThrough() { + return false; + } + + @Override + public void setNoScrollThrough(boolean noScrollThrough) { + + } + + @Override + public int[] getVarTransmitTrigger() { + return null; + } + + @Override + public void setVarTransmitTrigger(int... trigger) { + + } + + @Override + public void setOnClickListener(Object... args) { + + } + + @Override + public void setOnHoldListener(Object... args) { + + } + + @Override + public void setOnReleaseListener(Object... args) { + + } + + @Override + public void setOnDragCompleteListener(Object... args) { + + } + + @Override + public void setOnDragListener(Object... args) { + + } + + @Override + public void setOnScrollWheelListener(Object... args) { + + } + + @Override + public Widget getDragParent() { + return null; + } + + @Override + public Widget setDragParent(Widget dragParent) { + return null; + } + + @Override + public Object[] getOnVarTransmitListener() { + return new Object[0]; + } + + @Override + public void setOnVarTransmitListener(Object... args) { + + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Inventory.java b/src/main/java/ee/futur/baseapi/collections/Inventory.java new file mode 100644 index 0000000..8fd8c53 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Inventory.java @@ -0,0 +1,55 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class Inventory { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List inventoryItems = new ArrayList<>(); + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + client.runScript(6009, 9764864, 28, 1, -1); + Inventory.inventoryItems = + Arrays.stream(client.getWidget(WidgetInfo.INVENTORY).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(inventoryItems); + } + + public static int getEmptySlots() { + return 28 - search().result().size(); + } + + public static boolean full() { + return getEmptySlots() == 0; + } + + public static int getItemAmount(int itemId) { + return search().withId(itemId).result().size(); + } + + public static int getItemAmount(String itemName) { + return search().withName(itemName).result().size(); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + Inventory.inventoryItems.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/NPCs.java b/src/main/java/ee/futur/baseapi/collections/NPCs.java new file mode 100644 index 0000000..9bda659 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/NPCs.java @@ -0,0 +1,32 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.NPCQuery; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.events.GameTick; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.List; + +public class NPCs { + static Client client = RuneLite.getInjector().getInstance(Client.class); + private static final List npcList = new ArrayList<>(); + + public static NPCQuery search() { + return new NPCQuery(npcList); + } + + @Subscribe(priority = 10000) + public void onGameTick(GameTick e) { + npcList.clear(); + for (NPC npc : client.getNpcs()) { + if (npc == null) + continue; + if (npc.getId() == -1) + continue; + npcList.add(npc); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Players.java b/src/main/java/ee/futur/baseapi/collections/Players.java new file mode 100644 index 0000000..deb19f2 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Players.java @@ -0,0 +1,30 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.PlayerQuery; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.events.GameTick; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.List; + +public class Players { + static List players = new ArrayList<>(); + static Client client = RuneLite.getInjector().getInstance(Client.class); + + public static PlayerQuery search() { + return new PlayerQuery(players); + } + + @Subscribe + public void onGameTick(GameTick e) { + players.clear(); + for (Player player : client.getPlayers()) { + if (player == null) + continue; + players.add(player); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Shop.java b/src/main/java/ee/futur/baseapi/collections/Shop.java new file mode 100644 index 0000000..6b14421 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Shop.java @@ -0,0 +1,64 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.client.RuneLite; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class Shop { + private static final int SHOP_ITEM_CONTAINER_PACKED_ID = 19660816; + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List shopItems = new ArrayList<>(); + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + shopItems = + Arrays.stream(client.getWidget(SHOP_ITEM_CONTAINER_PACKED_ID).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(shopItems.stream().filter(Objects::nonNull).collect(Collectors.toList())); + } + +// @Subscribe +// public void onWidgetLoaded(WidgetLoaded e) +// { +// if (e.getGroupId() == WidgetID.SHOP_GROUP_ID) +// { +// try +// { +// shopItems = +// Arrays.stream(client.getWidget(SHOP_ITEM_CONTAINER_PACKED_ID).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// } +// catch (NullPointerException err) +// { +// shopItems.clear(); +// } +// } +// } +// +// @Subscribe +// public void onItemContainerChanged(ItemContainerChanged e) +// { +// if (client.getWidget(SHOP_ITEM_CONTAINER_PACKED_ID) == null) +// { +// shopItems.clear(); +// return; +// } +// try +// { +// shopItems = +// Arrays.stream(client.getWidget(SHOP_ITEM_CONTAINER_PACKED_ID).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// } +// catch (NullPointerException err) +// { +// shopItems.clear(); +// } +// } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/ShopInventory.java b/src/main/java/ee/futur/baseapi/collections/ShopInventory.java new file mode 100644 index 0000000..f6d0038 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/ShopInventory.java @@ -0,0 +1,79 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ShopInventory { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List shopInventoryItems = new ArrayList<>(); + static int lastUpdateTick = 0; + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + shopInventoryItems = + Arrays.stream(client.getWidget(WidgetInfo.SHOP_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(shopInventoryItems.stream().filter(Objects::nonNull).collect(Collectors.toList())); + } + +// @Subscribe +// public void onWidgetLoaded(WidgetLoaded e) +// { +// if (e.getGroupId() == WidgetID.SHOP_INVENTORY_GROUP_ID) +// { +// try +// { +// ShopInventory.shopInventoryItems = +// Arrays.stream(client.getWidget(WidgetInfo.SHOP_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// } +// catch (NullPointerException err) +// { +// ShopInventory.shopInventoryItems.clear(); +// } +// } +// } +// +// @Subscribe +// public void onItemContainerChanged(ItemContainerChanged e) +// { +// if (e.getContainerId() == 256) +// { +// if (client.getWidget(WidgetInfo.SHOP_INVENTORY_ITEMS_CONTAINER) == null) +// { +// ShopInventory.shopInventoryItems.clear(); +// return; +// } +// try +// { +// ShopInventory.shopInventoryItems = +// Arrays.stream(client.getWidget(WidgetInfo.SHOP_INVENTORY_ITEMS_CONTAINER).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); +// return; +// } +// catch (NullPointerException err) +// { +// ShopInventory.shopInventoryItems.clear(); +// return; +// } +// } +// } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + ShopInventory.shopInventoryItems.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/TileItems.java b/src/main/java/ee/futur/baseapi/collections/TileItems.java new file mode 100644 index 0000000..cd2900e --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/TileItems.java @@ -0,0 +1,14 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.TileItemQuery; + +import java.util.ArrayList; +import java.util.List; + +public class TileItems { + public static List tileItems = new ArrayList<>(); + + public static TileItemQuery search() { + return new TileItemQuery(tileItems); + } +} diff --git a/src/main/java/ee/futur/baseapi/collections/TileObjects.java b/src/main/java/ee/futur/baseapi/collections/TileObjects.java new file mode 100644 index 0000000..07ad2b8 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/TileObjects.java @@ -0,0 +1,77 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.TileObjectQuery; +import net.runelite.api.*; +import net.runelite.api.events.GameTick; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +public class TileObjects { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List tileObjects = new ArrayList<>(); + + public static TileObjectQuery search() { + return new TileObjectQuery(tileObjects); + } + + @Subscribe(priority = 10000) + public void onGameTick(GameTick e) { + HashSet tileObjectHashSet = new HashSet<>(); + tileObjects.clear(); + TileItems.tileItems.clear(); + for (Tile[] tiles : client.getScene().getTiles()[client.getPlane()]) { + if (tiles == null) { + continue; + } + for (Tile tile : tiles) { + if (tile == null) { + continue; + } + if (tile.getGroundItems() != null) { + for (TileItem groundItem : tile.getGroundItems()) { + if (groundItem == null) { + continue; + } + TileItems.tileItems.add(new ETileItem(tile.getWorldLocation(), groundItem)); + } + } + for (GameObject gameObject : tile.getGameObjects()) { + if (gameObject == null) { + continue; + } + if (gameObject.getId() == -1) { + continue; + } + tileObjectHashSet.add(gameObject); + //tileObjects.add(gameObject); + } + if (tile.getGroundObject() != null) { + if (tile.getGroundObject().getId() == -1) { + continue; + } + tileObjectHashSet.add(tile.getGroundObject()); + //tileObjects.add(tile.getGroundObject()); + } + if (tile.getWallObject() != null) { + if (tile.getWallObject().getId() == -1) { + continue; + } + tileObjectHashSet.add(tile.getWallObject()); + //tileObjects.add(tile.getWallObject()); + } + if (tile.getDecorativeObject() != null) { + if (tile.getDecorativeObject().getId() == -1) { + continue; + } + tileObjectHashSet.add(tile.getDecorativeObject()); + //tileObjects.add(tile.getDecorativeObject()); + } + } + } + tileObjects.addAll(tileObjectHashSet); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/TradeInventory.java b/src/main/java/ee/futur/baseapi/collections/TradeInventory.java new file mode 100644 index 0000000..fd0cb2b --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/TradeInventory.java @@ -0,0 +1,41 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.ItemQuery; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.client.RuneLite; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class TradeInventory { + private static final int TRADE_INVENTORY_PACKED_ID = 22020096; + + static int lastUpdateTick = 0; + + static Client client = RuneLite.getInjector().getInstance(Client.class); + static List tradeInventoryItems = new ArrayList<>(); + + public static ItemQuery search() { + if (lastUpdateTick < client.getTickCount()) { + client.runScript(6009, 9764864, 28, 1, -1); + tradeInventoryItems = + Arrays.stream(client.getWidget(TRADE_INVENTORY_PACKED_ID).getDynamicChildren()).filter(Objects::nonNull).filter(x -> x.getItemId() != 6512 && x.getItemId() != -1).collect(Collectors.toList()); + lastUpdateTick = client.getTickCount(); + } + return new ItemQuery(tradeInventoryItems); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) { + if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) { + tradeInventoryItems.clear(); + } + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/Widgets.java b/src/main/java/ee/futur/baseapi/collections/Widgets.java new file mode 100644 index 0000000..f798f52 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/Widgets.java @@ -0,0 +1,76 @@ +package ee.futur.baseapi.collections; + +import ee.futur.baseapi.collections.query.WidgetQuery; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.client.RuneLite; + +import java.util.ArrayList; +import java.util.HashSet; + +public class Widgets { + static Client client = RuneLite.getInjector().getInstance(Client.class); + static int lastSearchIdleTicks = -10; + static HashSet cachedWidgets = new HashSet<>(); + + //It is important to note that this method will return all widgets, including hidden ones. + //Some widgets are not updated while hidden so there is a chance that the widgets returned contain outdated + // information. + //for update critical information make sure the widget is not hidden or use the other query types like inventory, + // equipment ect as they will only return up-to-date information. + public static WidgetQuery search() { + if (lastSearchIdleTicks == client.getKeyboardIdleTicks()) { + return new WidgetQuery(cachedWidgets); + } + HashSet returnList = new HashSet<>(); + Widget[] currentQueue; + ArrayList buffer = new ArrayList<>(); + currentQueue = client.getWidgetRoots(); + while (currentQueue.length != 0) { + for (Widget widget : currentQueue) { + if (widget == null) { + continue; + } + returnList.add(widget); + if (widget.getDynamicChildren() != null) { + for (Widget dynamicChild : widget.getDynamicChildren()) { + if (dynamicChild == null) { + continue; + } + buffer.add(dynamicChild); + returnList.add(dynamicChild); + } + } + if (widget.getNestedChildren() != null) { + for (Widget nestedChild : widget.getNestedChildren()) { + if (nestedChild == null) { + continue; + } + buffer.add(nestedChild); + returnList.add(nestedChild); + } + } + Widget[] staticChildren; + try { + staticChildren = widget.getStaticChildren(); + } catch (NullPointerException e) { + continue; + } + if (staticChildren != null) { + for (Widget staticChild : staticChildren) { + if (staticChild == null) { + continue; + } + buffer.add(staticChild); + returnList.add(staticChild); + } + } + } + currentQueue = buffer.toArray(new Widget[]{}); + buffer.clear(); + } + lastSearchIdleTicks = client.getKeyboardIdleTicks(); + cachedWidgets = returnList; + return new WidgetQuery(returnList); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/EquipmentItemQuery.java b/src/main/java/ee/futur/baseapi/collections/query/EquipmentItemQuery.java new file mode 100644 index 0000000..03eb2b9 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/EquipmentItemQuery.java @@ -0,0 +1,88 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.collections.EquipmentItemWidget; +import net.runelite.api.widgets.Widget; +import net.runelite.client.util.Text; +import net.runelite.client.util.WildcardMatcher; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class EquipmentItemQuery { + private List items; + + public EquipmentItemQuery(List items) { + this.items = new ArrayList(items); + } + + public EquipmentItemQuery filter(Predicate predicate) { + items = items.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery withAction(String action) { + items = items.stream().filter(item -> Arrays.asList(item.getActions()).contains(action)).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery withId(int id) { + items = items.stream().filter(item -> item.getEquipmentItemId() == id).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery withName(String name) { + items = items.stream().filter(item -> item.getName().equals(name)).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery nameContains(String name) { + items = items.stream().filter(item -> item.getName().contains(name)).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery nameContainsNoCase(String name) { + items = + items.stream().filter(item -> item.getName().toLowerCase().contains(name.toLowerCase())).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery idInList(List ids) { + items = items.stream().filter(item -> ids.contains(item.getEquipmentItemId())).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery indexIs(int index) { + items = items.stream().filter(item -> item.getIndex() == index).collect(Collectors.toList()); + return this; + } + + public EquipmentItemQuery matchesWildCardNoCase(String input) { + items = + items.stream(). + filter(item -> WildcardMatcher.matches(input.toLowerCase(), Text.removeTags(item.getName().toLowerCase()))). + collect(Collectors.toList()); + return this; + } + + public boolean empty() { + return items.size() == 0; + } + + public EquipmentItemQuery filterUnique() { + items = items.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(Widget::getItemId))), ArrayList::new)); + return this; + } + + public List result() { + return items; + } + + public Optional first() { + Widget returnWidget = null; + if (items.size() == 0) { + return Optional.ofNullable(null); + } + return Optional.ofNullable(items.get(0)); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/ItemQuery.java b/src/main/java/ee/futur/baseapi/collections/query/ItemQuery.java new file mode 100644 index 0000000..64c44c0 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/ItemQuery.java @@ -0,0 +1,157 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.BaseApiPlugin; +import lombok.SneakyThrows; +import net.runelite.api.Client; +import net.runelite.api.ItemComposition; +import net.runelite.api.widgets.Widget; +import net.runelite.client.RuneLite; +import net.runelite.client.game.ItemManager; +import net.runelite.client.util.Text; +import net.runelite.client.util.WildcardMatcher; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class ItemQuery { + private List items; + static Client client = RuneLite.getInjector().getInstance(Client.class); + static ItemManager itemManager = RuneLite.getInjector().getInstance(ItemManager.class); + + public ItemQuery(List items) { + this.items = new ArrayList(items); + } + + public ItemQuery filter(Predicate predicate) { + items = items.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public ItemQuery withAction(String action) { + items = items.stream().filter(item -> Arrays.asList(item.getActions()).contains(action)).collect(Collectors.toList()); + return this; + } + + public ItemQuery tradeAble() { + items = items.stream().filter(item -> itemManager.getItemComposition(item.getItemId()).isTradeable()).collect(Collectors.toList()); + return this; + } + + public ItemQuery differenceInValueLessThan(int difference) { + items = items.stream().filter(item -> Math.abs(itemManager.getItemComposition(item.getItemId()).getHaPrice() - itemManager.getItemPriceWithSource(item.getItemId(), true)) < difference).collect(Collectors.toList()); + return this; + } + + public ItemQuery priceOver(int price) { + items = items.stream().filter(item -> itemManager.getItemComposition(item.getItemId()).getHaPrice() >= price).collect(Collectors.toList()); + return this; + } + + public ItemQuery withSet(Set ids) { + items = items.stream() + .filter(item -> ids.contains(item.getItemId())) + .collect(Collectors.toList()); + return this; + } + + public ItemQuery withId(int id) { + items = items.stream().filter(item -> item.getItemId() == id).collect(Collectors.toList()); + return this; + } + + public ItemQuery withName(String name) { + items = items.stream().filter(item -> Text.removeTags(item.getName()).equals(Text.removeTags(name))).collect(Collectors.toList()); + return this; + } + + public ItemQuery quantityGreaterThan(int quanity) { + items = items.stream().filter(item -> item.getItemQuantity() > quanity).collect(Collectors.toList()); + return this; + } + + public ItemQuery nameContains(String name) { + items = items.stream().filter(item -> item.getName().contains(name)).collect(Collectors.toList()); + return this; + } + + public ItemQuery nonPlaceHolder() { + return quantityGreaterThan(0); + } + + public ItemQuery idInList(List ids) { + items = items.stream().filter(item -> ids.contains(item.getItemId())).collect(Collectors.toList()); + return this; + } + + public ItemQuery nameInList(List names) { + items = items.stream() + .filter(item -> names.stream() + .map(String::toLowerCase) + .anyMatch(name -> Text.removeTags(item.getName()).equalsIgnoreCase(name))) + .collect(Collectors.toList()); + return this; + } + + public ItemQuery indexIs(int index) { + items = items.stream().filter(item -> item.getIndex() == index).collect(Collectors.toList()); + return this; + } + + public ItemQuery matchesWildCardNoCase(String input) { + items = + items.stream(). + filter(item -> WildcardMatcher.matches(input.toLowerCase(), Text.removeTags(item.getName().toLowerCase()))). + collect(Collectors.toList()); + return this; + } + + public ItemQuery onlyNoted() { + items = items.stream().filter(this::isNoted).collect(Collectors.toList()); + return this; + } + + public ItemQuery onlyStackable() { + items = items.stream().filter(this::isStackable).collect(Collectors.toList()); + return this; + } + + + public ItemQuery onlyUnnoted() { + items = items.stream().filter(item -> !isNoted(item)).collect(Collectors.toList()); + return this; + } + + public boolean empty() { + return items.size() == 0; + } + + public ItemQuery filterUnique() { + items = items.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(Widget::getItemId))), ArrayList::new)); + return this; + } + + public List result() { + return items; + } + + public Optional first() { + Widget returnWidget = null; + if (items.size() == 0) { + return Optional.ofNullable(null); + } + return Optional.ofNullable(items.get(0)); + } + + @SneakyThrows + public boolean isNoted(Widget item) { + ItemComposition itemComposition = BaseApiPlugin.itemDefs.get(item.getItemId()); + return itemComposition.getNote() != -1; + } + + @SneakyThrows + public boolean isStackable(Widget item) { + ItemComposition itemComposition = BaseApiPlugin.itemDefs.get(item.getItemId()); + return itemComposition.isStackable(); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/NPCQuery.java b/src/main/java/ee/futur/baseapi/collections/query/NPCQuery.java new file mode 100644 index 0000000..ca36955 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/NPCQuery.java @@ -0,0 +1,232 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.collections.Players; +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.baseapi.utils.WorldAreaUtility; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCComposition; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.RuneLite; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class NPCQuery { + static Client client = RuneLite.getInjector().getInstance(Client.class); + private List npcs; + + public NPCQuery(List npcs) { + this.npcs = new ArrayList(npcs.stream().filter(Objects::nonNull).collect(Collectors.toList())); + } + + public NPCQuery filter(Predicate predicate) { + npcs = npcs.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public NPCQuery atLocation(WorldPoint wp) { + npcs = npcs.stream().filter(npc -> npc.getWorldLocation().equals(wp)).collect(Collectors.toList()); + return this; + } + + public NPCQuery withAction(String action) { + npcs = npcs.stream().filter(npc -> { + NPCComposition npcComposition = getNPCComposition(npc); + if (npcComposition == null) + return false; + String[] actions = getNPCComposition(npc).getActions(); + return Arrays.stream(actions).filter(Objects::nonNull).anyMatch(a -> a.equalsIgnoreCase(action)); + }).collect(Collectors.toList()); + return this; + } + + public NPCQuery withId(int id) { + npcs = npcs.stream().filter(npc -> npc.getId() == id).collect(Collectors.toList()); + return this; + } + + public NPCQuery withName(String name) { + npcs = npcs.stream().filter(npcs -> npcs.getName() != null && npcs.getName().equals(name)).collect(Collectors.toList()); + return this; + } + + public NPCQuery nameContains(String name) { + npcs = npcs.stream().filter(npcs -> npcs.getName() != null && npcs.getName().contains(name)).collect(Collectors.toList()); + return this; + } + + public NPCQuery interactingWithLocal() { + List filteredNPCs = new ArrayList<>(); + for (NPC npc : npcs) { + if (!npc.isInteracting()) + continue; + if (npc.getInteracting() == client.getLocalPlayer()) + filteredNPCs.add(npc); + } + npcs = filteredNPCs; + return this; + } + + public NPCQuery interactingWith(Actor actor) { + List filteredNPCs = new ArrayList<>(); + for (NPC npc : npcs) { + if (!npc.isInteracting()) + continue; + if (npc.getInteracting() == actor) + filteredNPCs.add(npc); + } + npcs = filteredNPCs; + return this; + } + + public NPCQuery idInList(List ids) { + npcs = npcs.stream().filter(npcs -> ids.contains(npcs.getId())).collect(Collectors.toList()); + return this; + } + + public NPCQuery withinWorldArea(WorldArea area) { + npcs = npcs.stream().filter(npcs -> area.contains(npcs.getWorldLocation())).collect(Collectors.toList()); + return this; + } + + public NPCQuery withinBounds(WorldPoint min, WorldPoint max) { + int x1 = min.getX(); + int x2 = max.getX(); + int y1 = min.getY(); + int y2 = max.getY(); + + npcs = npcs.stream().filter(npc -> { + int x3 = npc.getWorldLocation().getX(); + int y3 = npc.getWorldLocation().getY(); + + if (x3 > Math.max(x1, x2) || x3 < Math.min(x1, x2)) { + return false; + } + + return y3 <= Math.max(y1, y2) && y3 >= Math.min(y1, y2); + }).collect(Collectors.toList()); + return this; + } + + public NPCQuery indexIs(int index) { + npcs = npcs.stream().filter(npcs -> npcs.getIndex() == index).collect(Collectors.toList()); + return this; + } + + public boolean empty() { + return npcs.size() == 0; + } + + public NPCQuery filterUnique() { + npcs = + npcs.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(NPC::getId))), ArrayList::new)); + return this; + } + + public List result() { + return npcs; + } + + public NPCQuery walkable() { + npcs = npcs.stream().filter(npc -> BaseApiPlugin.canPathToTile(npc.getWorldLocation()).isReachable()).collect(Collectors.toList()); + return this; + } + + public NPCQuery interacting() { + npcs = npcs.stream().filter(Actor::isInteracting).collect(Collectors.toList()); + return this; + } + + public NPCQuery notInteracting() { + npcs = npcs.stream().filter(npc -> !npc.isInteracting()).collect(Collectors.toList()); + return this; + } + + public NPCQuery noOneInteractingWith() { + npcs = npcs.stream().filter(npc -> Players.search().interactingWith(npc).isEmpty()).collect(Collectors.toList()); + return this; + } + + public NPCQuery playerInteractingWith() { + npcs = npcs.stream().filter(npc -> client.getLocalPlayer().isInteracting() && client.getLocalPlayer().getInteracting() == npc).collect(Collectors.toList()); + return this; + } + + public NPCQuery playerNotInteractingWith() { + npcs = npcs.stream().filter(npc -> !client.getLocalPlayer().isInteracting() || client.getLocalPlayer().getInteracting() != npc).collect(Collectors.toList()); + return this; + } + + public NPCQuery meleeable() { + List meleeTiles = new ArrayList<>(); + meleeTiles.add(client.getLocalPlayer().getWorldLocation().dx(1)); + meleeTiles.add(client.getLocalPlayer().getWorldLocation().dx(-1)); + meleeTiles.add(client.getLocalPlayer().getWorldLocation().dy(1)); + meleeTiles.add(client.getLocalPlayer().getWorldLocation().dy(-1)); + npcs = + npcs.stream().filter(npc -> !Collections.disjoint(meleeTiles, npc.getWorldArea().toWorldPointList()) && npc.getWorldArea().distanceTo(client.getLocalPlayer().getWorldLocation()) == 1).collect(Collectors.toList()); + return this; + } + + public NPCQuery alive() { + npcs = npcs.stream().filter(npc -> !npc.isDead() && npc.getHealthRatio() != 0).collect(Collectors.toList()); + return this; + } + + public Optional nearestToPlayer() { + if (npcs.size() == 0) { + return Optional.ofNullable(null); + } + return npcs.stream().min(Comparator.comparingInt(npc -> npc.getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()))); + } + + public Optional nearestToPoint(WorldPoint point) { + if (npcs.size() == 0) { + return Optional.ofNullable(null); + } + return npcs.stream().min(Comparator.comparingInt(npc -> npc.getWorldLocation().distanceTo(point))); + } + + public Optional first() { + if (npcs.size() == 0) { + return Optional.ofNullable(null); + } + return Optional.ofNullable(npcs.get(0)); + } + + public static NPCComposition getNPCComposition(NPC npc) { + if (npc.getComposition().getConfigs() == null || npc.getTransformedComposition() == null) { + return npc.getComposition(); + } + return npc.getTransformedComposition(); + } + + public Optional nearestByPath() { + HashMap npcMap = new HashMap<>(); + for (NPC npc : npcs) { + for (WorldPoint wp : npc.getWorldArea().toWorldPointList()) { + npcMap.put(wp, npc); + } + + for (WorldPoint wp : WorldAreaUtility.objectInteractableTiles(npc)) { + npcMap.put(wp, npc); + } + } + List path = BaseApiPlugin.pathToGoalSetFromPlayerNoCustomTiles(new HashSet<>(npcMap.keySet())); + if (path == null) { + return Optional.empty(); + } + if (path.isEmpty()) { + if (npcMap.containsKey(client.getLocalPlayer().getWorldLocation())) { + return Optional.ofNullable(npcMap.get(client.getLocalPlayer().getWorldLocation())); + } else { + return Optional.empty(); + } + } + return Optional.ofNullable(npcMap.get(path.get(path.size() - 1))); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/PlayerQuery.java b/src/main/java/ee/futur/baseapi/collections/query/PlayerQuery.java new file mode 100644 index 0000000..23f4ceb --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/PlayerQuery.java @@ -0,0 +1,131 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.baseapi.utils.WorldAreaUtility; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.RuneLite; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class PlayerQuery { + static Client client = RuneLite.getInjector().getInstance(Client.class); + private List players; + + public PlayerQuery(List players) { + this.players = new ArrayList<>(players); + } + + public PlayerQuery withName(String name) { + List filteredPlayers = new ArrayList<>(); + for (Player player : players) { + if (player.getName().equals(name)) + filteredPlayers.add(player); + } + players = filteredPlayers; + return this; + } + + public PlayerQuery withinWorldArea(WorldArea area) { + players = players.stream().filter(player -> area.contains(player.getWorldLocation())).collect(Collectors.toList()); + return this; + } + + public PlayerQuery filter(Predicate predicate) { + players = players.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public PlayerQuery interactingWithLocal() { + List filteredPlayers = new ArrayList<>(); + for (Player player : players) { + if (!player.isInteracting()) + continue; + if (player.getInteracting() == client.getLocalPlayer()) + filteredPlayers.add(player); + } + players = filteredPlayers; + return this; + } + + public PlayerQuery interactingWith(Actor actor) { + List filteredPlayers = new ArrayList<>(); + for (Player player : players) { + if (!player.isInteracting()) + continue; + if (player.getInteracting() == actor) + filteredPlayers.add(player); + } + players = filteredPlayers; + return this; + } + + public PlayerQuery nameContains(String name) { + List filteredPlayers = new ArrayList<>(); + for (Player player : players) { + if (player.getName().contains(name)) + filteredPlayers.add(player); + } + players = filteredPlayers; + return this; + } + + public PlayerQuery notLocalPlayer() { + players.remove(client.getLocalPlayer()); + return this; + } + + public PlayerQuery withinLevel(int low, int high) { + List filteredPlayers = new ArrayList<>(); + for (Player player : players) { + if (player.getCombatLevel() >= low && player.getCombatLevel() <= high) + filteredPlayers.add(player); + } + players = filteredPlayers; + return this; + } + + public boolean isEmpty() { + return players.isEmpty(); + } + + public Optional first() { + if (players.isEmpty()) + return Optional.empty(); + return Optional.ofNullable(players.get(0)); + } + + public List result() { + return players; + } + + public Optional nearestByPath() { + HashMap playerMap = new HashMap<>(); + for (Player player : players) { + for (WorldPoint wp : player.getWorldArea().toWorldPointList()) { + playerMap.put(wp, player); + } + + for (WorldPoint wp : WorldAreaUtility.objectInteractableTiles(player)) { + playerMap.put(wp, player); + } + } + List path = BaseApiPlugin.pathToGoalSetFromPlayerNoCustomTiles(new HashSet<>(playerMap.keySet())); + if (path == null) { + return Optional.empty(); + } + if (path.isEmpty()) { + if (playerMap.containsKey(client.getLocalPlayer().getWorldLocation())) { + return Optional.ofNullable(playerMap.get(client.getLocalPlayer().getWorldLocation())); + } else { + return Optional.empty(); + } + } + return Optional.ofNullable(playerMap.get(path.get(path.size() - 1))); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/QuickPrayer.java b/src/main/java/ee/futur/baseapi/collections/query/QuickPrayer.java new file mode 100644 index 0000000..16c5b71 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/QuickPrayer.java @@ -0,0 +1,44 @@ +package ee.futur.baseapi.collections.query; + +public enum QuickPrayer { + THICK_SKIN(0), + BURST_OF_STRENGTH(1), + CLARITY_OF_THOUGHT(2), + SHARP_EYE(18), + MYSTIC_WILL(19), + ROCK_SKIN(3), + SUPERHUMAN_STRENGTH(4), + IMPROVED_REFLEXES(5), + RAPID_RESTORE(6), + RAPID_HEAL(7), + PROTECT_ITEM(8), + HAWK_EYE(20), + MYSTIC_LORE(21), + STEEL_SKIN(9), + ULTIMATE_STRENGTH(10), + INCREDIBLE_REFLEXES(11), + PROTECT_FROM_MAGIC(12), + PROTECT_FROM_MISSILES(13), + PROTECT_FROM_MELEE(14), + EAGLE_EYE(22), + MYSTIC_MIGHT(23), + RETRIBUTION(15), + REDEMPTION(16), + SMITE(17), + PRESERVE(28), + CHIVALRY(25), + PIETY(26), + RIGOUR(24), + AUGURY(27); + private final int index; + private int varbit; + + QuickPrayer(int index) { + this.varbit = varbit; + this.index = index; + } + + public int getIndex() { + return index; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/TileItemQuery.java b/src/main/java/ee/futur/baseapi/collections/query/TileItemQuery.java new file mode 100644 index 0000000..88fa67d --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/TileItemQuery.java @@ -0,0 +1,219 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.collections.ETileItem; +import ee.futur.baseapi.BaseApiPlugin; +import lombok.SneakyThrows; +import net.runelite.api.Client; +import net.runelite.api.ItemComposition; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.RuneLite; +import net.runelite.client.game.ItemManager; +import net.runelite.client.util.Text; +import net.runelite.client.util.WildcardMatcher; + +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class TileItemQuery { + public List tileItems; + static Client client = RuneLite.getInjector().getInstance(Client.class); + static ItemManager itemManager = RuneLite.getInjector().getInstance(ItemManager.class); + + public TileItemQuery(List tileItems) { + this.tileItems = new ArrayList(tileItems); + } + + public TileItemQuery withId(int id) { + tileItems = this.tileItems.stream().filter(tileItem -> tileItem.tileItem.getId() == id).collect(Collectors.toList()); + return this; + } + + @SneakyThrows + public TileItemQuery withName(String name) { + tileItems = tileItems.stream().filter(tileItem -> + { + try { + return BaseApiPlugin.itemDefs.get(tileItem.tileItem.getId()).getName().equals(name); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + return this; + } + + public TileItemQuery nameContains(String name) { + tileItems = tileItems.stream().filter(tileItem -> + { + try { + return BaseApiPlugin.itemDefs.get(tileItem.tileItem.getId()).getName().contains(name); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + return this; + } + + public TileItemQuery filter(Predicate predicate) { + tileItems = tileItems.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public TileItemQuery onlyNoted() { + tileItems = tileItems.stream().filter(this::isNoted).collect(Collectors.toList()); + return this; + } + + public TileItemQuery onlyUnnoted() { + tileItems = tileItems.stream().filter(item -> !isNoted(item)).collect(Collectors.toList()); + return this; + } + + public TileItemQuery matchesWildCardNoCase(String input) { + tileItems = + tileItems.stream(). + filter(item -> + { + try { + return WildcardMatcher.matches(input.toLowerCase(), + Text.removeTags(BaseApiPlugin.itemDefs.get(item.tileItem.getId()).getName().toLowerCase())); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }). + collect(Collectors.toList()); + return this; + } + + public TileItemQuery eachItemAboveXValue(int value) { + tileItems = tileItems.stream().filter(item -> itemManager.getItemPrice(item.getTileItem().getId()) > value).collect(Collectors.toList()); + return this; + } + + public TileItemQuery stackAboveXValue(int value) { + tileItems = tileItems.stream().filter(item -> item.getTileItem().getQuantity() * itemManager.getItemPrice(item.getTileItem().getId()) > value).collect(Collectors.toList()); + return this; + } + + //the 3 methods below are ugly af and might not work + public TileItemQuery doesNotMatchWildCardNoCase(String input) { + tileItems = + tileItems.stream(). + filter(item -> + { + try { + return !WildcardMatcher.matches(input.toLowerCase(), + Text.removeTags(BaseApiPlugin.itemDefs.get(item.tileItem.getId()).getName().toLowerCase())); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }). + collect(Collectors.toList()); + return this; + } + + public TileItemQuery itemsMatchingWildcardsNoCase(String... input) { + List tileItemsTemp = new ArrayList<>(); + for (String s : input) { + tileItemsTemp.addAll(tileItems.stream(). + filter(item -> + { + try { + return WildcardMatcher.matches(s.toLowerCase(), + Text.removeTags(BaseApiPlugin.itemDefs.get(item.tileItem.getId()).getName().toLowerCase())); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }). + collect(Collectors.toList())); + } + tileItems = tileItemsTemp; + return this; + } + + public TileItemQuery itemsExcludingMatchingWildcardsNoCase(String... input) { + List tileItemsTemp = new ArrayList<>(); + for (String s : input) { + tileItemsTemp.addAll(tileItems.stream(). + filter(item -> + { + try { + return WildcardMatcher.matches(s.toLowerCase(), + Text.removeTags(BaseApiPlugin.itemDefs.get(item.tileItem.getId()).getName().toLowerCase())); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + }). + collect(Collectors.toList())); + } + tileItems.removeAll(tileItemsTemp); + return this; + } + + + public boolean empty() { + return tileItems.size() == 0; + } + + public List result() { + return tileItems; + } + + public Optional first() { + if (tileItems.size() == 0) { + return Optional.empty(); + } + return Optional.ofNullable(tileItems.get(0)); + } + + public TileItemQuery withinDistance(int distance) { + tileItems = tileItems.stream().filter(tileItem -> tileItem.getLocation().distanceTo(client.getLocalPlayer().getWorldLocation()) <= distance).collect(Collectors.toList()); + return this; + } + + public TileItemQuery withinDistanceToPoint(int distance, WorldPoint point) { + tileItems = tileItems.stream().filter(tileItem -> tileItem.getLocation().distanceTo(point) <= distance).collect(Collectors.toList()); + return this; + } + + public TileItemQuery alchValueAbove(int value) { + tileItems = tileItems.stream().filter(tileItem -> itemManager.getItemComposition(tileItem.getTileItem().getId()).getHaPrice() > value).collect(Collectors.toList()); + return this; + } + + public Optional nearestToPlayer() { + return nearestToPoint(client.getLocalPlayer().getWorldLocation()); + } + + public Optional nearestToPoint(WorldPoint point) { + if (tileItems.size() == 0) { + return Optional.empty(); + } + return tileItems.stream().min(Comparator.comparingInt(tileItem -> tileItem.location.distanceTo(point))); + } + + @SneakyThrows + public boolean isNoted(ETileItem item) { + ItemComposition itemComposition = BaseApiPlugin.itemDefs.get(item.tileItem.getId()); + return itemComposition.getNote() != -1; + } + + public Optional nearestByPath() { + HashSet tiles = new HashSet<>(); + HashMap map = new HashMap<>(); + WorldPoint playerLoc = client.getLocalPlayer().getWorldLocation(); + for (var t : tileItems) { + if (playerLoc.equals(t.getLocation())) { + return Optional.of(t); + } + map.put(t.getLocation(), t); + tiles.add(t.getLocation()); + } + List path = BaseApiPlugin.pathToGoalSetFromPlayerNoCustomTiles(new HashSet<>(tiles)); + if (path == null || path.isEmpty()) { + return Optional.empty(); + } + return Optional.ofNullable(map.get(path.get(path.size() - 1))); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/TileObjectQuery.java b/src/main/java/ee/futur/baseapi/collections/query/TileObjectQuery.java new file mode 100644 index 0000000..291f2a1 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/TileObjectQuery.java @@ -0,0 +1,179 @@ +package ee.futur.baseapi.collections.query; + +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.baseapi.utils.WorldAreaUtility; +import net.runelite.api.Client; +import net.runelite.api.ObjectComposition; +import net.runelite.api.TileObject; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.RuneLite; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class TileObjectQuery { + private List tileObjects; + static Client client = RuneLite.getInjector().getInstance(Client.class); + + public TileObjectQuery(List tileObjects) { + this.tileObjects = new ArrayList(tileObjects); + } + + public TileObjectQuery withName(String name) { + tileObjects = + tileObjects.stream().filter(tileObject -> { + ObjectComposition objectComposition = getObjectComposition(tileObject); + if (objectComposition == null) + return false; + return objectComposition.getName().equals(name); + }).collect(Collectors.toList()); + return this; + } +// public TileObjectQuery withActions(String... actions){ +//tileObjects = +// tileObjects.stream().filter(tileObject -> { +// ObjectComposition objectComposition = getObjectComposition(tileObject); +// if (objectComposition == null) +// return false; +// String[] objectActions = objectComposition.getActions(); +// for (String action : actions) { +// if (Arrays.stream(objectActions).filter(Objects::nonNull).anyMatch(a -> a.equalsIgnoreCase(action))) { +// return true; +// } +// } +// return false; +// }).collect(Collectors.toList()); +// return this; +// } + + public TileObjectQuery withId(int id) { + tileObjects = tileObjects.stream().filter(tileObject -> tileObject.getId() == id).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery withAction(String action) { + tileObjects = + tileObjects.stream().filter(tileObject -> + { + ObjectComposition objectComposition = getObjectComposition(tileObject); + if (objectComposition == null) + return false; + String[] actions = getObjectComposition(tileObject).getActions(); + return Arrays.stream(actions).filter(Objects::nonNull).anyMatch(a -> a.equalsIgnoreCase(action)); + }).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery atLocation(WorldPoint location) { + tileObjects = tileObjects.stream().filter(tileObject -> tileObject.getWorldLocation().equals(location)).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery withinDistance(int distance) { + tileObjects = tileObjects.stream().filter(tileObject -> tileObject.getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()) <= distance).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery withinBounds(WorldPoint min, WorldPoint max) { + int x1 = min.getX(); + int x2 = max.getX(); + int y1 = min.getY(); + int y2 = max.getY(); + + tileObjects = tileObjects.stream().filter(tileObject -> { + int x3 = tileObject.getWorldLocation().getX(); + int y3 = tileObject.getWorldLocation().getY(); + + if (x3 > Math.max(x1, x2) || x3 < Math.min(x1, x2)) { + return false; + } + + return y3 <= Math.max(y1, y2) && y3 >= Math.min(y1, y2); + }).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery atLocation(int x, int y, int plane) { + WorldPoint p = new WorldPoint(x, y, plane); + tileObjects = + tileObjects.stream().filter(tileObject -> tileObject.getWorldLocation().equals(p)).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery filter(Predicate predicate) { + tileObjects = tileObjects.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery nameContains(String name) { + tileObjects = + tileObjects.stream().filter(tileObject -> { + ObjectComposition comp = getObjectComposition(tileObject); + if (comp == null) + return false; + return comp.getName().contains(name); + }).collect(Collectors.toList()); + return this; + } + + public TileObjectQuery idInList(List ids) { + tileObjects = tileObjects.stream().filter(tileObject -> ids.contains(tileObject.getId())).collect(Collectors.toList()); + return this; + } + + public boolean empty() { + return tileObjects.size() == 0; + } + + public List result() { + return tileObjects; + } + + public Optional first() { + return tileObjects.stream().findFirst(); + } + + public Optional nearestToPlayer() { + return tileObjects.stream().min(Comparator.comparingInt(o -> client.getLocalPlayer().getWorldLocation().distanceTo(o.getWorldLocation()))); + } + + public Optional nearestByPath() { + HashMap map = new HashMap<>(); + var playerLoc = client.getLocalPlayer().getWorldLocation(); + for (TileObject tileObject : tileObjects) { + List adjacentTiles = WorldAreaUtility.objectInteractableTiles(tileObject); + for (WorldPoint worldPoint : adjacentTiles) { + if (playerLoc.equals(worldPoint)) { + return Optional.of(tileObject); + } + map.put(worldPoint, tileObject); + } + } + + List path = BaseApiPlugin.pathToGoalSetFromPlayerNoCustomTiles(new HashSet<>(map.keySet())); + if (path == null || path.isEmpty()) { + return Optional.empty(); + } + + return Optional.ofNullable(map.get(path.get(path.size() - 1))); + } + + public Optional nearestToPoint(WorldPoint point) { + return tileObjects.stream().min(Comparator.comparingInt(o -> point.distanceTo(o.getWorldLocation()))); + } + + public static ObjectComposition getObjectComposition(TileObject tileObject) { + if (client.getObjectDefinition(tileObject.getId()).getImpostorIds() == null || client.getObjectDefinition(tileObject.getId()).getImpostor() == null) { + return client.getObjectDefinition(tileObject.getId()); + } + return client.getObjectDefinition(tileObject.getId()).getImpostor(); + } + + public static ObjectComposition getObjectComposition(int id) { + if (client.getObjectDefinition(id).getImpostorIds() == null || client.getObjectDefinition(id).getImpostor() == null) { + return client.getObjectDefinition(id); + } + return client.getObjectDefinition(id).getImpostor(); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/collections/query/WidgetQuery.java b/src/main/java/ee/futur/baseapi/collections/query/WidgetQuery.java new file mode 100644 index 0000000..839944c --- /dev/null +++ b/src/main/java/ee/futur/baseapi/collections/query/WidgetQuery.java @@ -0,0 +1,120 @@ +package ee.futur.baseapi.collections.query; + +import net.runelite.api.widgets.Widget; +import net.runelite.client.util.Text; +import net.runelite.client.util.WildcardMatcher; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class WidgetQuery { + List widgets; + + public WidgetQuery(HashSet widgets) { + this.widgets = new ArrayList<>(widgets); + } + + public List result() { + return widgets; + } + + public WidgetQuery filter(Predicate predicate) { + widgets = widgets.stream().filter(predicate).collect(Collectors.toList()); + return this; + } + + public WidgetQuery withAction(String action) { + widgets = widgets.stream().filter(x -> { + String[] actions = x.getActions(); + if (actions == null) { + return false; + } + for (String s : actions) { + if (s == null) { + continue; + } + if (Text.removeTags(s).equalsIgnoreCase(action)) { + return true; + } + } + return false; + }).collect(Collectors.toList()); + return this; + } + + public boolean empty() { + return widgets.isEmpty(); + } + + public WidgetQuery hiddenState(boolean hidden) { + widgets = widgets.stream().filter(widget -> widget.isHidden() == hidden).collect(java.util.stream.Collectors.toList()); + return this; + } + + public WidgetQuery withId(int id) { + widgets = widgets.stream().filter(widget -> widget.getId() == id).collect(java.util.stream.Collectors.toList()); + return this; + } + + public WidgetQuery withItemId(int itemId) { + widgets = widgets.stream().filter(widget -> widget.getItemId() == itemId).collect(java.util.stream.Collectors.toList()); + return this; + } + + public Optional first() { + return widgets.stream().findFirst(); + } + + public WidgetQuery nonPlaceHolder() { + return quantityGreaterThan(0); + } + + public WidgetQuery itemIdInList(List ids) { + widgets = widgets.stream().filter(item -> ids.contains(item.getItemId())).collect(Collectors.toList()); + return this; + } + + public WidgetQuery quantityGreaterThan(int quanity) { + widgets = widgets.stream().filter(item -> item.getItemQuantity() > quanity).collect(Collectors.toList()); + return this; + } + + public WidgetQuery nameContains(String name) { + widgets = + widgets.stream().filter(item -> item.getName() != null && item.getName().contains(name)).collect(Collectors.toList()); + return this; + } + + public WidgetQuery withName(String name) { + widgets = widgets.stream().filter(item -> item.getName() != null && Text.removeTags(item.getName()).equals(name)).collect(Collectors.toList()); + return this; + } + + public WidgetQuery withText(String text) { + widgets = widgets.stream().filter(item -> item.getText() != null && item.getText().equals(text)).collect(Collectors.toList()); + return this; + } + + public WidgetQuery withTextContains(String text) { + widgets = widgets.stream().filter(item -> item.getText() != null && item.getText().contains(text)).collect(Collectors.toList()); + return this; + } + + public WidgetQuery withParentId(int parentId) { + widgets = widgets.stream().filter(item -> item.getParentId() == parentId).collect(Collectors.toList()); + return this; + } + + public WidgetQuery nameMatchesWildCardNoCase(String input) { + widgets = + widgets.stream(). + filter(item -> item.getName() != null && WildcardMatcher.matches(input.toLowerCase(), + Text.removeTags(item.getName().toLowerCase()))). + collect(Collectors.toList()); + return this; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/interaction/TileObjectInteraction.java b/src/main/java/ee/futur/baseapi/nono/interaction/TileObjectInteraction.java new file mode 100644 index 0000000..6ad67ff --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/interaction/TileObjectInteraction.java @@ -0,0 +1,43 @@ +package ee.futur.baseapi.nono.interaction; + +import ee.futur.baseapi.collections.TileObjects; +import ee.futur.baseapi.collections.query.TileObjectQuery; +import ee.futur.baseapi.nono.packets.MousePackets; +import ee.futur.baseapi.nono.packets.ObjectPackets; +import net.runelite.api.ObjectComposition; +import net.runelite.api.TileObject; + +import java.util.Optional; + +public class TileObjectInteraction { + public static boolean interact(String name, String... actions) { + return TileObjects.search().withName(name).first().flatMap(tileObject -> + { + MousePackets.queueClickPacket(); + ObjectPackets.queueObjectAction(tileObject, false, actions); + return Optional.of(true); + }).orElse(false); + } + + public static boolean interact(int id, String... actions) { + return TileObjects.search().withId(id).first().flatMap(tileObject -> + { + MousePackets.queueClickPacket(); + ObjectPackets.queueObjectAction(tileObject, false, actions); + return Optional.of(true); + }).orElse(false); + } + + public static boolean interact(TileObject tileObject, String... actions) { + if (tileObject == null) { + return false; + } + ObjectComposition comp = TileObjectQuery.getObjectComposition(tileObject); + if (comp == null) { + return false; + } + MousePackets.queueClickPacket(); + ObjectPackets.queueObjectAction(tileObject, false, actions); + return true; + } +} diff --git a/src/main/java/ee/futur/baseapi/nono/packets/BufferMethods.java b/src/main/java/ee/futur/baseapi/nono/packets/BufferMethods.java new file mode 100644 index 0000000..58979f7 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/BufferMethods.java @@ -0,0 +1,106 @@ +package ee.futur.baseapi.nono.packets; + + +import ee.futur.utils.ObfuscatedNames; + +import java.lang.reflect.Field; + +public class BufferMethods { + + public static void setOffset(Object bufferInstance, int offset) { + try { + Field offsetField = bufferInstance.getClass().getField(ObfuscatedNames.bufferOffsetField); + offsetField.setAccessible(true); + offsetField.setInt(bufferInstance, offset); + offsetField.setAccessible(false); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + public static int getOffset(Object bufferInstance) { + try { + Field offsetField = bufferInstance.getClass().getField(ObfuscatedNames.bufferOffsetField); + offsetField.setAccessible(true); + int offset = offsetField.getInt(bufferInstance); + offsetField.setAccessible(false); + return offset; + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + return -1; + } + + public static void setArray(Object bufferInstance, byte[] array) { + try { + Field arrayField = bufferInstance.getClass().getField(ObfuscatedNames.bufferArrayField); + arrayField.setAccessible(true); + arrayField.set(bufferInstance, array); + arrayField.setAccessible(false); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + public static byte[] getArray(Object bufferInstance) { + try { + Field arrayField = bufferInstance.getClass().getField(ObfuscatedNames.bufferArrayField); + arrayField.setAccessible(true); + byte[] array = (byte[]) arrayField.get(bufferInstance); + arrayField.setAccessible(false); + return array; + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + public static void writeValue(String writeDescription, int value, Object bufferInstance) { + int writeTypeMagnitude = writeDescription.contains("v") ? 0 : Integer.parseInt(writeDescription.substring(1).trim()); + byte[] arr = getArray(bufferInstance); + int index = nextIndex(getOffset(bufferInstance)); + setOffset(bufferInstance, index); + index = index * Integer.parseInt(ObfuscatedNames.indexMultiplier) - 1; + //System.out.println("Index: " + index); + switch (writeDescription.charAt(0)) { + case 's': + setArray(bufferInstance, writeSub(writeTypeMagnitude, value, arr, index)); + break; + case 'a': + setArray(bufferInstance, writeAdd(writeTypeMagnitude, value, arr, index)); + break; + case 'r': + setArray(bufferInstance, writeRightShifted(writeTypeMagnitude, value, arr, index)); + break; + case 'v': + setArray(bufferInstance, writeVar(value, arr, index)); + break; + } + } + + static byte[] writeSub(int subValue, int value, byte[] arr, int index) { + arr[index] = (byte) (subValue - value); + return arr; + } + + static byte[] writeAdd(int addValue, int value, byte[] arr, int index) { + arr[index] = (byte) (addValue + value); + return arr; + } + + static byte[] writeRightShifted(int shiftAmount, int value, byte[] arr, int index) { + arr[index] = (byte) (value >> shiftAmount); + return arr; + } + + static byte[] writeVar(int value, byte[] arr, int index) { + arr[index] = (byte) (value); + return arr; + } + + static public int nextIndex(int offset) { + offset += (int) Long.parseLong(ObfuscatedNames.offsetMultiplier); + return offset; + } + +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/MousePackets.java b/src/main/java/ee/futur/baseapi/nono/packets/MousePackets.java new file mode 100644 index 0000000..898497d --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/MousePackets.java @@ -0,0 +1,127 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import ee.futur.utils.ObfuscatedNames; +import lombok.SneakyThrows; +import net.runelite.api.Client; +import net.runelite.client.RuneLite; + +import java.awt.event.KeyEvent; +import java.lang.reflect.Field; +import java.math.BigInteger; +import java.util.Random; +import java.util.concurrent.Executors; + +import static java.awt.event.InputEvent.BUTTON1_DOWN_MASK; + +public class MousePackets { + + static Client client = RuneLite.getInjector().getInstance(Client.class); + private static final Random random = new Random(); + private static long randomDelay = randomDelay(); + + public static BigInteger modInverse(BigInteger val, int bits) { + try { + BigInteger shift = BigInteger.ONE.shiftLeft(bits); + return val.modInverse(shift); + } catch (ArithmeticException e) { + return val; + } + } + + public static long modInverse(long val) { + return modInverse(BigInteger.valueOf(val), 64).longValue(); + } + + @SneakyThrows + public static void queueClickPacket(int x, int y) { + long mouseHandlerMS = System.currentTimeMillis(); + setMouseHandlerLastMillis(mouseHandlerMS); + long clientMS = getClientLastMillis(); + long deltaMs = mouseHandlerMS - clientMS; + setClientLastMillis(mouseHandlerMS); + if (deltaMs < 0) { + deltaMs = 0L; + } + if (deltaMs > 32767) { + deltaMs = 32767L; + } + int mouseInfo = ((int) deltaMs << 1); + PacketReflection.sendPacket(PacketDef.getEventMouseClick(), mouseInfo, x, y, 0); + if (checkIdleLogout()) { + randomDelay = randomDelay(); + Executors.newSingleThreadExecutor() + .submit(MousePackets::pressKey); + } + } + + public static void queueClickPacket() { + queueClickPacket(0, 0); + } + + private static boolean checkIdleLogout() { + int idleClientTicks = client.getKeyboardIdleTicks(); + + if (client.getMouseIdleTicks() < idleClientTicks) { + idleClientTicks = client.getMouseIdleTicks(); + } + + return idleClientTicks >= randomDelay; + } + + private static long randomDelay() { + return (long) clamp( + Math.round(random.nextGaussian() * 8000) + ); + } + + private static double clamp(double val) { + return Math.max(1, Math.min(13000, val)); + } + + private static void pressKey() { + KeyEvent keyPress = new KeyEvent(client.getCanvas(), KeyEvent.KEY_PRESSED, System.currentTimeMillis(), BUTTON1_DOWN_MASK, KeyEvent.VK_BACK_SPACE); + client.getCanvas().dispatchEvent(keyPress); + KeyEvent keyRelease = new KeyEvent(client.getCanvas(), KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, KeyEvent.VK_BACK_SPACE); + client.getCanvas().dispatchEvent(keyRelease); + KeyEvent keyTyped = new KeyEvent(client.getCanvas(), KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, KeyEvent.VK_UNDEFINED); + client.getCanvas().dispatchEvent(keyTyped); + } + + @SneakyThrows + public static long getMouseHandlerLastMillis() { + Class mouseHandler = client.getClass().getClassLoader().loadClass(ObfuscatedNames.MouseHandler_lastPressedTimeMillisClass); + Field mouseHandlerLastPressedTime = mouseHandler.getDeclaredField(ObfuscatedNames.MouseHandler_lastPressedTimeMillisField); + mouseHandlerLastPressedTime.setAccessible(true); + long retValue = mouseHandlerLastPressedTime.getLong(null) * Long.parseLong(ObfuscatedNames.mouseHandlerMillisMultiplier); + mouseHandlerLastPressedTime.setAccessible(false); + return retValue; + } + + @SneakyThrows + public static long getClientLastMillis() { + Field clientLastPressedTimeMillis = client.getClass().getDeclaredField(ObfuscatedNames.clientMillisField); + clientLastPressedTimeMillis.setAccessible(true); + long retValue = clientLastPressedTimeMillis.getLong(client) * Long.parseLong(ObfuscatedNames.clientMillisMultiplier); + clientLastPressedTimeMillis.setAccessible(false); + return retValue; + } + + @SneakyThrows + public static void setMouseHandlerLastMillis(long time) { + Class mouseHandler = client.getClass().getClassLoader().loadClass(ObfuscatedNames.MouseHandler_lastPressedTimeMillisClass); + Field mouseHandlerLastPressedTime = mouseHandler.getDeclaredField(ObfuscatedNames.MouseHandler_lastPressedTimeMillisField); + mouseHandlerLastPressedTime.setAccessible(true); + mouseHandlerLastPressedTime.setLong(null, time * modInverse(Long.parseLong(ObfuscatedNames.mouseHandlerMillisMultiplier))); + mouseHandlerLastPressedTime.setAccessible(false); + } + + @SneakyThrows + public static void setClientLastMillis(long time) { + Field clientLastPressedTimeMillis = client.getClass().getDeclaredField(ObfuscatedNames.clientMillisField); + clientLastPressedTimeMillis.setAccessible(true); + clientLastPressedTimeMillis.setLong(client, time * modInverse(Long.parseLong(ObfuscatedNames.clientMillisMultiplier))); + clientLastPressedTimeMillis.setAccessible(false); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/MovementPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/MovementPackets.java new file mode 100644 index 0000000..4f7cefd --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/MovementPackets.java @@ -0,0 +1,16 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import net.runelite.api.coords.WorldPoint; + +public class MovementPackets { + public static void queueMovement(int worldPointX, int worldPointY, boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + PacketReflection.sendPacket(PacketDef.getMoveGameClick(), worldPointX, worldPointY, ctrl, 5); + } + + public static void queueMovement(WorldPoint location) { + queueMovement(location.getX(), location.getY(), false); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/NPCPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/NPCPackets.java new file mode 100644 index 0000000..2d954c9 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/NPCPackets.java @@ -0,0 +1,81 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.collections.query.NPCQuery; +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import lombok.SneakyThrows; +import net.runelite.api.NPC; +import net.runelite.api.NPCComposition; +import net.runelite.api.widgets.Widget; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class NPCPackets { + + @SneakyThrows + public static void queueNPCAction(int actionFieldNo, int npcIndex, boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + switch (actionFieldNo) { + case 1: + PacketReflection.sendPacket(PacketDef.getOpNpc1(), npcIndex, ctrl); + break; + case 2: + PacketReflection.sendPacket(PacketDef.getOpNpc2(), npcIndex, ctrl); + break; + case 3: + PacketReflection.sendPacket(PacketDef.getOpNpc3(), npcIndex, ctrl); + break; + case 4: + PacketReflection.sendPacket(PacketDef.getOpNpc4(), npcIndex, ctrl); + break; + case 5: + PacketReflection.sendPacket(PacketDef.getOpNpc5(), npcIndex, ctrl); + break; + } + } + + @SneakyThrows + public static void queueNPCAction(NPC npc, String... actionList) { + if (npc == null) { + return; + } + NPCComposition comp = NPCQuery.getNPCComposition(npc); + if (comp == null) { + return; + } + if (comp.getActions() == null) { + return; + } + List actions = Arrays.stream(comp.getActions()).collect(Collectors.toList()); + for (int i = 0; i < actions.size(); i++) { + if (actions.get(i) == null) + continue; + actions.set(i, actions.get(i).toLowerCase()); + } + int num = -1; + for (String action : actions) { + for (String action2 : actionList) { + if (action != null && action.equalsIgnoreCase(action2)) { + num = actions.indexOf(action.toLowerCase()) + 1; + } + } + } + + if (num < 1 || num > 10) { + return; + } + queueNPCAction(num, npc.getIndex(), false); + } + + public static void queueWidgetOnNPC(int npcIndex, int sourceItemId, int sourceSlot, int sourceWidgetId, + boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + PacketReflection.sendPacket(PacketDef.getOpNpcT(), npcIndex, sourceItemId, sourceSlot, sourceWidgetId, ctrl); + } + + public static void queueWidgetOnNPC(NPC npc, Widget widget) { + queueWidgetOnNPC(npc.getIndex(), widget.getItemId(), widget.getIndex(), widget.getId(), false); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/ObjectPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/ObjectPackets.java new file mode 100644 index 0000000..524a8a9 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/ObjectPackets.java @@ -0,0 +1,107 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.collections.query.TileObjectQuery; +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import lombok.SneakyThrows; +import net.runelite.api.GameObject; +import net.runelite.api.ObjectComposition; +import net.runelite.api.Point; +import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class ObjectPackets { + @SneakyThrows + public static void queueObjectAction(int actionFieldNo, int objectId, int worldPointX, int worldPointY, + boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + switch (actionFieldNo) { + case 1: + PacketReflection.sendPacket(PacketDef.getOpLoc1(), objectId, worldPointX, worldPointY, ctrl); + break; + case 2: + PacketReflection.sendPacket(PacketDef.getOpLoc2(), objectId, worldPointX, worldPointY, ctrl); + break; + case 3: + PacketReflection.sendPacket(PacketDef.getOpLoc3(), objectId, worldPointX, worldPointY, ctrl); + break; + case 4: + PacketReflection.sendPacket(PacketDef.getOpLoc4(), objectId, worldPointX, worldPointY, ctrl); + break; + case 5: + PacketReflection.sendPacket(PacketDef.getOpLoc5(), objectId, worldPointX, worldPointY, ctrl); + break; + } + } + + @SneakyThrows + public static void queueObjectAction(TileObject object, boolean ctrlDown, String... actionlist) { + if (object == null) { + return; + } + ObjectComposition comp = TileObjectQuery.getObjectComposition(object); + if (comp == null) { + return; + } + if (comp.getActions() == null) { + return; + } + List actions = Arrays.stream(comp.getActions()).collect(Collectors.toList()); + for (int i = 0; i < actions.size(); i++) { + if (actions.get(i) == null) + continue; + actions.set(i, actions.get(i).toLowerCase()); + } + Point p; + if (object instanceof GameObject) { + GameObject gameObject = (GameObject) object; + p = gameObject.getSceneMinLocation(); + } else { + p = new Point(object.getLocalLocation().getSceneX(), object.getLocalLocation().getSceneY()); + } + LocalPoint lp = new LocalPoint(p.getX(), p.getY()); + WorldPoint wp = WorldPoint.fromScene(PacketReflection.getClient(), lp.getX(), lp.getY(), object.getPlane()); + int num = -1; + for (String action : actions) { + for (String action2 : actionlist) { + if (action != null && action.equalsIgnoreCase(action2.toLowerCase())) { + num = actions.indexOf(action) + 1; + } + } + } + + if (num < 1 || num > 10) { + return; + } + queueObjectAction(num, object.getId(), wp.getX(), wp.getY(), ctrlDown); + } + + public static void queueWidgetOnTileObject(int objectId, int worldPointX, int worldPointY, int sourceSlot, + int sourceItemId, int sourceWidgetId, boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + PacketReflection.sendPacket(PacketDef.getOpLocT(), objectId, worldPointX, worldPointY, sourceSlot, sourceItemId, + sourceWidgetId, ctrl); + } + + public static void queueWidgetOnTileObject(Widget widget, TileObject object) { + Point p; + if (object instanceof GameObject) { + GameObject gameObject = (GameObject) object; + p = gameObject.getSceneMinLocation(); + } else { + p = new Point(object.getLocalLocation().getSceneX(), object.getLocalLocation().getSceneY()); + } + LocalPoint lp = new LocalPoint(p.getX(), p.getY()); + WorldPoint wp = WorldPoint.fromScene(PacketReflection.getClient(), lp.getX(), lp.getY(), object.getPlane()); + queueWidgetOnTileObject(object.getId(), wp.getX(), wp.getY(), widget.getIndex(), + widget.getItemId(), + widget.getId(), + false); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/PlayerPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/PlayerPackets.java new file mode 100644 index 0000000..8fee73e --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/PlayerPackets.java @@ -0,0 +1,77 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import lombok.SneakyThrows; +import net.runelite.api.Player; +import net.runelite.api.widgets.Widget; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class PlayerPackets { + @SneakyThrows + public static void queuePlayerAction(int actionFieldNo, int playerIndex, boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + switch (actionFieldNo) { + case 1: + PacketReflection.sendPacket(PacketDef.getOpPlayer1(), playerIndex, ctrl); + break; + case 2: + PacketReflection.sendPacket(PacketDef.getOpPlayer2(), playerIndex, ctrl); + break; + case 3: + PacketReflection.sendPacket(PacketDef.getOpPlayer3(), playerIndex, ctrl); + break; + case 4: + PacketReflection.sendPacket(PacketDef.getOpPlayer4(), playerIndex, ctrl); + break; + case 5: + PacketReflection.sendPacket(PacketDef.getOpPlayer5(), playerIndex, ctrl); + break; + case 6: + PacketReflection.sendPacket(PacketDef.getOpPlayer6(), playerIndex, ctrl); + break; + case 7: + PacketReflection.sendPacket(PacketDef.getOpPlayer7(), playerIndex, ctrl); + break; + case 8: + PacketReflection.sendPacket(PacketDef.getOpPlayer8(), playerIndex, ctrl); + break; + } + } + + @SneakyThrows + public static void queuePlayerAction(Player player, String... actionlist) { + List actions = Arrays.stream(PacketReflection.getClient().getPlayerOptions()).collect(Collectors.toList()); + for (int i = 0; i < actions.size(); i++) { + if (actions.get(i) == null) + continue; + actions.set(i, actions.get(i).toLowerCase()); + } + int num = -1; + for (String action : actions) { + for (String action2 : actionlist) { + if (action != null && action.equalsIgnoreCase(action2)) { + num = actions.indexOf(action.toLowerCase()) + 1; + } + } + } + + if (num < 1 || num > 10) { + return; + } + queuePlayerAction(num, player.getId(), false); + } + + public static void queueWidgetOnPlayer(int playerIndex, int sourceItemId, int sourceSlot, int sourceWidgetId, + boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + PacketReflection.sendPacket(PacketDef.getOpPlayerT(), playerIndex, sourceItemId, sourceSlot, sourceWidgetId, ctrl); + } + + public static void queueWidgetOnPlayer(Player player, Widget widget) { + queueWidgetOnPlayer(player.getId(), widget.getItemId(), widget.getIndex(), widget.getId(), false); + } +} diff --git a/src/main/java/ee/futur/baseapi/nono/packets/TileItemPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/TileItemPackets.java new file mode 100644 index 0000000..2f2360d --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/TileItemPackets.java @@ -0,0 +1,50 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.collections.ETileItem; +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import lombok.SneakyThrows; +import net.runelite.api.widgets.Widget; + +public class TileItemPackets { + @SneakyThrows + public static void queueTileItemAction(int actionFieldNo, int objectId, int worldPointX, int worldPointY, + boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + switch (actionFieldNo) { + case 1: + PacketReflection.sendPacket(PacketDef.getOpObj1(), objectId, worldPointX, worldPointY, ctrl); + break; + case 2: + PacketReflection.sendPacket(PacketDef.getOpObj2(), objectId, worldPointX, worldPointY, ctrl); + break; + case 3: + PacketReflection.sendPacket(PacketDef.getOpObj3(), objectId, worldPointX, worldPointY, ctrl); + break; + case 4: + PacketReflection.sendPacket(PacketDef.getOpObj4(), objectId, worldPointX, worldPointY, ctrl); + break; + case 5: + PacketReflection.sendPacket(PacketDef.getOpObj5(), objectId, worldPointX, worldPointY, ctrl); + break; + } + } + + public static void queueWidgetOnTileItem(int objectId, int worldPointX, int worldPointY, int sourceSlot, + int sourceItemId, int sourceWidgetId, boolean ctrlDown) { + int ctrl = ctrlDown ? 1 : 0; + PacketReflection.sendPacket(PacketDef.getOpObjT(), objectId, worldPointX, worldPointY, sourceSlot, sourceItemId, + sourceWidgetId, ctrl); + } + + public static void queueTileItemAction(ETileItem item, boolean ctrlDown) { + queueTileItemAction(3, item.getTileItem().getId(), item.getLocation().getX(), item.getLocation().getY(), + ctrlDown); + } + + public static void queueWidgetOnTileItem(ETileItem item, Widget w, + boolean ctrlDown) { + queueWidgetOnTileItem(item.getTileItem().getId(), item.getLocation().getX(), item.getLocation().getY(), + w.getIndex(), w.getItemId(), w.getId(), ctrlDown); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/WidgetPackets.java b/src/main/java/ee/futur/baseapi/nono/packets/WidgetPackets.java new file mode 100644 index 0000000..6e2b3bf --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/WidgetPackets.java @@ -0,0 +1,118 @@ +package ee.futur.baseapi.nono.packets; + +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.baseapi.nono.packets.utils.PacketDef; +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import lombok.SneakyThrows; +import net.runelite.api.ItemComposition; +import net.runelite.api.widgets.Widget; +import net.runelite.client.util.Text; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class WidgetPackets { + @SneakyThrows + public static void queueWidgetActionPacket(int actionFieldNo, int widgetId, int itemId, int childId) { + PacketReflection.sendPacket(PacketDef.getIfButtonX(), widgetId, childId, itemId, actionFieldNo & 65535); + } + + @SneakyThrows + public static void queueWidgetSubAction(Widget widget, String menu, String action) { + if (widget == null || widget.getItemId() == -1) { + return; + } + + ItemComposition composition = BaseApiPlugin.getClient().getItemDefinition(widget.getItemId()); + String[][] subOps = composition.getSubops(); + List actions = Arrays.stream(widget.getActions()).collect(Collectors.toList()); + + int menuIndex = -1; + int actionIndex = -1; + + if (subOps == null) { + return; + } + + for (String[] subOp : subOps) { + if (actionIndex != -1) { + break; + } + if (subOp != null) { + for (int i = 0; i < subOp.length; i++) { + String op = subOp[i]; + if (op != null && op.equalsIgnoreCase(action)) { + actionIndex = i; + break; + } + } + } + } + + for (int i = 0; i < actions.size(); i++) { + String a = actions.get(i); + if (a != null && a.equalsIgnoreCase(menu)) { + menuIndex = i + 1; + break; + } + } + + if (menuIndex == -1 || actionIndex == -1) { + return; + } + + PacketReflection.sendPacket(PacketDef.getIfSubOp(), widget.getId(), widget.getIndex(), + widget.getItemId(), menuIndex, actionIndex); + } + + @SneakyThrows + public static void queueWidgetAction(Widget widget, String... actionlist) { + if (widget == null) { + return; + } + List actions = Arrays.stream(widget.getActions()).collect(Collectors.toList()); + for (int i = 0; i < actions.size(); i++) { + if (actions.get(i) == null) + continue; + actions.set(i, actions.get(i).toLowerCase()); + } + int num = -1; + for (String action : actions) { + for (String action2 : actionlist) { + if (action != null && Text.removeTags(action).equalsIgnoreCase(action2)) { + num = actions.indexOf(action.toLowerCase()) + 1; + } + } + } + + if (num < 1 || num > 10) { + return; + } + queueWidgetActionPacket(num, widget.getId(), widget.getItemId(), widget.getIndex()); + } + + public static void queueWidgetOnWidget(Widget srcWidget, Widget destWidget) { + queueWidgetOnWidget(srcWidget.getId(), srcWidget.getIndex(), srcWidget.getItemId(), + destWidget.getId(), destWidget.getIndex(), destWidget.getItemId()); + } + + public static void queueWidgetOnWidget(int sourceWidgetId, int sourceSlot, int sourceItemId, + int destinationWidgetId, int destinationSlot, int destinationItemId) { + PacketReflection.sendPacket(PacketDef.getIfButtonT(), sourceWidgetId, sourceSlot, sourceItemId, destinationWidgetId, + destinationSlot, destinationItemId); + } + + public static void queueResumePause(int widgetId, int childId) { + PacketReflection.sendPacket(PacketDef.getResumePausebutton(), widgetId, childId); + } + + public static void queueResumeCount(int id) { + PacketReflection.sendPacket(PacketDef.getResumeCountDialog(), id); + } + + public static void queueDragAndDrop(Widget src, Widget dest) { + PacketReflection.sendPacket(PacketDef.getOpHeldd(), src.getId(), src.getIndex(), + src.getItemId(), dest.getId(), dest.getIndex(), dest.getItemId()); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/ObfuscatedNames.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/ObfuscatedNames.java new file mode 100644 index 0000000..e79a15a --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/ObfuscatedNames.java @@ -0,0 +1,523 @@ +package ee.futur.baseapi.nono.packets.utils; + +public final class ObfuscatedNames { + +// public static final String EVENT_MOUSE_CLICK_OBFUSCATEDNAME = "cv"; +// public static final String EVENT_MOUSE_CLICK_WRITE1 = "mouseInfo"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME1 = "xg"; +// public static final String EVENT_MOUSE_CLICK_WRITE2 = "mouseY"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME2 = "xg"; +// public static final String EVENT_MOUSE_CLICK_WRITE3 = "mouseX"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME3 = "xg"; +// public static final String[][] EVENT_MOUSE_CLICK_WRITES = new String[][] { +// {"r 8", "v"}, +// {"r 8", "v"}, +// {"r 8", "v"} +// }; + + // when officially live we switch to MOUSE_V2 packet + public static final String EVENT_MOUSE_CLICK_OBFUSCATEDNAME = "ch"; + public static final String EVENT_MOUSE_CLICK_WRITE1 = "mouseX"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME1 = "dy"; + public static final String EVENT_MOUSE_CLICK_WRITE2 = "mouseInfo"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME2 = "kl"; + public static final String EVENT_MOUSE_CLICK_WRITE3 = "0"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME3 = "bg"; + public static final String EVENT_MOUSE_CLICK_WRITE4 = "mouseY"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME4 = "kl"; + public static final String[][] EVENT_MOUSE_CLICK_WRITES = new String[][] { + {"v", "r 8"}, + {"a 128", "r 8"}, + {"v"}, + {"a 128", "r 8"}, + }; + + public static final String IF_BUTTONT_OBFUSCATEDNAME = "cn"; + public static final String IF_BUTTONT_WRITE1 = "destinationItemId"; + public static final String IF_BUTTONT_METHOD_NAME1 = "kl"; + public static final String IF_BUTTONT_WRITE2 = "destinationWidgetId"; + public static final String IF_BUTTONT_METHOD_NAME2 = "eg"; + public static final String IF_BUTTONT_WRITE3 = "sourceItemId"; + public static final String IF_BUTTONT_METHOD_NAME3 = "mp"; + public static final String IF_BUTTONT_WRITE4 = "destinationSlot"; + public static final String IF_BUTTONT_METHOD_NAME4 = "kl"; + public static final String IF_BUTTONT_WRITE5 = "sourceWidgetId"; + public static final String IF_BUTTONT_METHOD_NAME5 = "eg"; + public static final String IF_BUTTONT_WRITE6 = "sourceSlot"; + public static final String IF_BUTTONT_METHOD_NAME6 = "mp"; + public static final String[][] IF_BUTTONT_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + }; + + public static final String IF_BUTTONX_OBFUSCATEDNAME = "al"; + public static final String IF_BUTTONX_WRITE1 = "widgetId"; + public static final String IF_BUTTONX_METHOD_NAME_1 = "bu"; + public static final String IF_BUTTONX_WRITE2 = "slot"; + public static final String IF_BUTTONX_METHOD_NAME_2 = "bt"; + public static final String IF_BUTTONX_WRITE3 = "itemId"; + public static final String IF_BUTTONX_METHOD_NAME_3 = "bt"; + public static final String IF_BUTTONX_WRITE4 = "opCode"; + public static final String IF_BUTTONX_METHOD_NAME_4 = "bg"; + public static final String[][] IF_BUTTONX_WRITES = { + {"r 24", "r 16", "r 8", "v"}, + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + }; + + public static final String IF_SUBOP_OBFUSCATEDNAME = "dj"; + public static final String IF_SUBOP_WRITE1 = "widgetId"; + public static final String IF_SUBOP_METHOD_NAME1 = "bu"; + public static final String IF_SUBOP_WRITE2 = "slot"; + public static final String IF_SUBOP_METHOD_NAME2 = "bt"; + public static final String IF_SUBOP_WRITE3 = "itemId"; + public static final String IF_SUBOP_METHOD_NAME3 = "bt"; + public static final String IF_SUBOP_WRITE4 = "menuIndex"; + public static final String IF_SUBOP_METHOD_NAME4 = "bg"; + public static final String IF_SUBOP_WRITE5 = "subActionIndex"; + public static final String IF_SUBOP_METHOD_NAME5 = "bg"; + public static final String[][] IF_SUBOP_WRITES = new String[][]{ + {"r 24", "r 16", "r 8", "v"}, + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + {"v"} + }; + + public static final String MOVE_GAMECLICK_OBFUSCATEDNAME = "bd"; + public static final String MOVE_GAMECLICK_WRITE1 = "5"; + public static final String MOVE_GAMECLICK_METHOD_NAME1 = "bg"; + public static final String MOVE_GAMECLICK_WRITE2 = "worldPointX"; + public static final String MOVE_GAMECLICK_METHOD_NAME2 = "dy"; + public static final String MOVE_GAMECLICK_WRITE3 = "worldPointY"; + public static final String MOVE_GAMECLICK_METHOD_NAME3 = "dy"; + public static final String MOVE_GAMECLICK_WRITE4 = "ctrlDown"; + public static final String MOVE_GAMECLICK_METHOD_NAME4 = "bg"; + public static final String[][] MOVE_GAMECLICK_WRITES = new String[][]{ + {"v"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"v"}, + }; + public static final String OPLOC1_OBFUSCATEDNAME = "bi"; + public static final String OPLOC1_WRITE1 = "objectId"; + public static final String OPLOC1_METHOD_NAME1 = "bt"; + public static final String OPLOC1_WRITE2 = "ctrlDown"; + public static final String OPLOC1_METHOD_NAME2 = "db"; + public static final String OPLOC1_WRITE3 = "worldPointX"; + public static final String OPLOC1_METHOD_NAME3 = "dy"; + public static final String OPLOC1_WRITE4 = "worldPointY"; + public static final String OPLOC1_METHOD_NAME4 = "bt"; + public static final String[][] OPLOC1_WRITES = new String[][]{ + {"r 8", "v"}, + {"s 0"}, + {"v", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPLOC2_OBFUSCATEDNAME = "bw"; + public static final String OPLOC2_WRITE1 = "worldPointX"; + public static final String OPLOC2_METHOD_NAME1 = "mp"; + public static final String OPLOC2_WRITE2 = "objectId"; + public static final String OPLOC2_METHOD_NAME2 = "bt"; + public static final String OPLOC2_WRITE3 = "worldPointY"; + public static final String OPLOC2_METHOD_NAME3 = "mp"; + public static final String OPLOC2_WRITE4 = "ctrlDown"; + public static final String OPLOC2_METHOD_NAME4 = "dg"; + public static final String[][] OPLOC2_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"r 8", "v"}, + {"r 8", "a 128"}, + {"a 128"}, + }; + public static final String OPLOC3_OBFUSCATEDNAME = "by"; + public static final String OPLOC3_WRITE1 = "worldPointY"; + public static final String OPLOC3_METHOD_NAME1 = "dy"; + public static final String OPLOC3_WRITE2 = "ctrlDown"; + public static final String OPLOC3_METHOD_NAME2 = "dg"; + public static final String OPLOC3_WRITE3 = "worldPointX"; + public static final String OPLOC3_METHOD_NAME3 = "kl"; + public static final String OPLOC3_WRITE4 = "objectId"; + public static final String OPLOC3_METHOD_NAME4 = "kl"; + public static final String[][] OPLOC3_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128"}, + {"a 128", "r 8"}, + {"a 128", "r 8"}, + }; + public static final String OPLOC4_OBFUSCATEDNAME = "dk"; + public static final String OPLOC4_WRITE1 = "objectId"; + public static final String OPLOC4_METHOD_NAME1 = "bt"; + public static final String OPLOC4_WRITE2 = "worldPointX"; + public static final String OPLOC4_METHOD_NAME2 = "bt"; + public static final String OPLOC4_WRITE3 = "ctrlDown"; + public static final String OPLOC4_METHOD_NAME3 = "bg"; + public static final String OPLOC4_WRITE4 = "worldPointY"; + public static final String OPLOC4_METHOD_NAME4 = "mp"; + public static final String[][] OPLOC4_WRITES = new String[][]{ + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + {"r 8", "a 128"}, + }; + public static final String OPLOC5_OBFUSCATEDNAME = "cl"; + public static final String OPLOC5_WRITE1 = "objectId"; + public static final String OPLOC5_METHOD_NAME1 = "bt"; + public static final String OPLOC5_WRITE2 = "ctrlDown"; + public static final String OPLOC5_METHOD_NAME2 = "db"; + public static final String OPLOC5_WRITE3 = "worldPointY"; + public static final String OPLOC5_METHOD_NAME3 = "kl"; + public static final String OPLOC5_WRITE4 = "worldPointX"; + public static final String OPLOC5_METHOD_NAME4 = "bt"; + public static final String[][] OPLOC5_WRITES = new String[][]{ + {"r 8", "v"}, + {"s 0"}, + {"a 128", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPLOCT_OBFUSCATEDNAME = "ah"; + public static final String OPLOCT_WRITE1 = "ctrlDown"; + public static final String OPLOCT_METHOD_NAME1 = "dh"; + public static final String OPLOCT_WRITE2 = "slot"; + public static final String OPLOCT_METHOD_NAME2 = "dy"; + public static final String OPLOCT_WRITE3 = "worldPointX"; + public static final String OPLOCT_METHOD_NAME3 = "dy"; + public static final String OPLOCT_WRITE4 = "objectId"; + public static final String OPLOCT_METHOD_NAME4 = "kl"; + public static final String OPLOCT_WRITE5 = "worldPointY"; + public static final String OPLOCT_METHOD_NAME5 = "bt"; + public static final String OPLOCT_WRITE6 = "itemId"; + public static final String OPLOCT_METHOD_NAME6 = "dy"; + public static final String OPLOCT_WRITE7 = "widgetId"; + public static final String OPLOCT_METHOD_NAME7 = "eg"; + public static final String[][] OPLOCT_WRITES = new String[][]{ + {"s 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"a 128", "r 8"}, + {"r 8", "v"}, + {"v", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + }; + public static final String OPNPC1_OBFUSCATEDNAME = "ac"; + public static final String OPNPC1_WRITE1 = "npcIndex"; + public static final String OPNPC1_METHOD_NAME1 = "dy"; + public static final String OPNPC1_WRITE2 = "ctrlDown"; + public static final String OPNPC1_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC1_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + }; + public static final String OPNPC2_OBFUSCATEDNAME = "cr"; + public static final String OPNPC2_WRITE1 = "ctrlDown"; + public static final String OPNPC2_METHOD_NAME1 = "bg"; + public static final String OPNPC2_WRITE2 = "npcIndex"; + public static final String OPNPC2_METHOD_NAME2 = "kl"; + public static final String[][] OPNPC2_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPNPC3_OBFUSCATEDNAME = "dw"; + public static final String OPNPC3_WRITE1 = "npcIndex"; + public static final String OPNPC3_METHOD_NAME1 = "dy"; + public static final String OPNPC3_WRITE2 = "ctrlDown"; + public static final String OPNPC3_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC3_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + }; + public static final String OPNPC4_OBFUSCATEDNAME = "ar"; + public static final String OPNPC4_WRITE1 = "npcIndex"; + public static final String OPNPC4_METHOD_NAME1 = "mp"; + public static final String OPNPC4_WRITE2 = "ctrlDown"; + public static final String OPNPC4_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC4_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"s 128"}, + }; + public static final String OPNPC5_OBFUSCATEDNAME = "ab"; + public static final String OPNPC5_WRITE1 = "npcIndex"; + public static final String OPNPC5_METHOD_NAME1 = "dy"; + public static final String OPNPC5_WRITE2 = "ctrlDown"; + public static final String OPNPC5_METHOD_NAME2 = "dg"; + public static final String[][] OPNPC5_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128"}, + }; + public static final String OPNPCT_OBFUSCATEDNAME = "cf"; + public static final String OPNPCT_WRITE1 = "slot"; + public static final String OPNPCT_METHOD_NAME1 = "kl"; + public static final String OPNPCT_WRITE2 = "widgetId"; + public static final String OPNPCT_METHOD_NAME2 = "es"; + public static final String OPNPCT_WRITE3 = "itemId"; + public static final String OPNPCT_METHOD_NAME3 = "dy"; + public static final String OPNPCT_WRITE4 = "npcIndex"; + public static final String OPNPCT_METHOD_NAME4 = "bt"; + public static final String OPNPCT_WRITE5 = "ctrlDown"; + public static final String OPNPCT_METHOD_NAME5 = "db"; + public static final String[][] OPNPCT_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 16", "r 24", "v", "r 8"}, + {"v", "r 8"}, + {"r 8", "v"}, + {"s 0"}, + }; + public static final String OPOBJ1_OBFUSCATEDNAME = "ct"; + public static final String OPOBJ1_WRITE1 = "ctrlDown"; + public static final String OPOBJ1_METHOD_NAME1 = "dg"; + public static final String OPOBJ1_WRITE2 = "worldPointY"; + public static final String OPOBJ1_METHOD_NAME2 = "dy"; + public static final String OPOBJ1_WRITE3 = "objectId"; + public static final String OPOBJ1_METHOD_NAME3 = "dy"; + public static final String OPOBJ1_WRITE4 = "worldPointX"; + public static final String OPOBJ1_METHOD_NAME4 = "bt"; + public static final String[][] OPOBJ1_WRITES = new String[][]{ + {"a 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPOBJ2_OBFUSCATEDNAME = "be"; + public static final String OPOBJ2_WRITE1 = "worldPointX"; + public static final String OPOBJ2_METHOD_NAME1 = "mp"; + public static final String OPOBJ2_WRITE2 = "worldPointY"; + public static final String OPOBJ2_METHOD_NAME2 = "dy"; + public static final String OPOBJ2_WRITE3 = "ctrlDown"; + public static final String OPOBJ2_METHOD_NAME3 = "bg"; + public static final String OPOBJ2_WRITE4 = "objectId"; + public static final String OPOBJ2_METHOD_NAME4 = "bt"; + public static final String[][] OPOBJ2_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v", "r 8"}, + {"v"}, + {"r 8", "v"}, + }; + public static final String OPOBJ3_OBFUSCATEDNAME = "cu"; + public static final String OPOBJ3_WRITE1 = "worldPointY"; + public static final String OPOBJ3_METHOD_NAME1 = "mp"; + public static final String OPOBJ3_WRITE2 = "ctrlDown"; + public static final String OPOBJ3_METHOD_NAME2 = "bg"; + public static final String OPOBJ3_WRITE3 = "worldPointX"; + public static final String OPOBJ3_METHOD_NAME3 = "kl"; + public static final String OPOBJ3_WRITE4 = "objectId"; + public static final String OPOBJ3_METHOD_NAME4 = "mp"; + public static final String[][] OPOBJ3_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v"}, + {"a 128", "r 8"}, + {"r 8", "a 128"}, + }; + public static final String OPOBJ4_OBFUSCATEDNAME = "ao"; + public static final String OPOBJ4_WRITE1 = "worldPointX"; + public static final String OPOBJ4_METHOD_NAME1 = "dy"; + public static final String OPOBJ4_WRITE2 = "ctrlDown"; + public static final String OPOBJ4_METHOD_NAME2 = "dh"; + public static final String OPOBJ4_WRITE3 = "worldPointY"; + public static final String OPOBJ4_METHOD_NAME3 = "dy"; + public static final String OPOBJ4_WRITE4 = "objectId"; + public static final String OPOBJ4_METHOD_NAME4 = "dy"; + public static final String[][] OPOBJ4_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + }; + public static final String OPOBJ5_OBFUSCATEDNAME = "cy"; + public static final String OPOBJ5_WRITE1 = "worldPointY"; + public static final String OPOBJ5_METHOD_NAME1 = "bt"; + public static final String OPOBJ5_WRITE2 = "objectId"; + public static final String OPOBJ5_METHOD_NAME2 = "dy"; + public static final String OPOBJ5_WRITE3 = "worldPointX"; + public static final String OPOBJ5_METHOD_NAME3 = "mp"; + public static final String OPOBJ5_WRITE4 = "ctrlDown"; + public static final String OPOBJ5_METHOD_NAME4 = "db"; + public static final String[][] OPOBJ5_WRITES = new String[][]{ + {"r 8", "v"}, + {"v", "r 8"}, + {"r 8", "a 128"}, + {"s 0"}, + }; + public static final String OPOBJT_OBFUSCATEDNAME = "cd"; + public static final String OPOBJT_WRITE1 = "itemId"; + public static final String OPOBJT_METHOD_NAME1 = "dy"; + public static final String OPOBJT_WRITE2 = "worldPointY"; + public static final String OPOBJT_METHOD_NAME2 = "kl"; + public static final String OPOBJT_WRITE3 = "ctrlDown"; + public static final String OPOBJT_METHOD_NAME3 = "db"; + public static final String OPOBJT_WRITE4 = "worldPointX"; + public static final String OPOBJT_METHOD_NAME4 = "mp"; + public static final String OPOBJT_WRITE5 = "objectId"; + public static final String OPOBJT_METHOD_NAME5 = "kl"; + public static final String OPOBJT_WRITE6 = "widgetId"; + public static final String OPOBJT_METHOD_NAME6 = "eg"; + public static final String OPOBJT_WRITE7 = "slot"; + public static final String OPOBJT_METHOD_NAME7 = "mp"; + public static final String[][] OPOBJT_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128", "r 8"}, + {"s 0"}, + {"r 8", "a 128"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + }; + public static final String OPPLAYER1_OBFUSCATEDNAME = "am"; + public static final String OPPLAYER1_WRITE1 = "playerIndex"; + public static final String OPPLAYER1_METHOD_NAME1 = "dy"; + public static final String OPPLAYER1_WRITE2 = "ctrlDown"; + public static final String OPPLAYER1_METHOD_NAME2 = "bg"; + public static final String[][] OPPLAYER1_WRITES = new String[][]{ + {"v", "r 8"}, + {"v"}, + }; + public static final String OPPLAYER2_OBFUSCATEDNAME = "bx"; + public static final String OPPLAYER2_WRITE1 = "playerIndex"; + public static final String OPPLAYER2_METHOD_NAME1 = "bt"; + public static final String OPPLAYER2_WRITE2 = "ctrlDown"; + public static final String OPPLAYER2_METHOD_NAME2 = "dg"; + public static final String[][] OPPLAYER2_WRITES = new String[][]{ + {"r 8", "v"}, + {"a 128"}, + }; + public static final String OPPLAYER3_OBFUSCATEDNAME = "cc"; + public static final String OPPLAYER3_WRITE1 = "playerIndex"; + public static final String OPPLAYER3_METHOD_NAME1 = "mp"; + public static final String OPPLAYER3_WRITE2 = "ctrlDown"; + public static final String OPPLAYER3_METHOD_NAME2 = "db"; + public static final String[][] OPPLAYER3_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"s 0"}, + }; + public static final String OPPLAYER4_OBFUSCATEDNAME = "bv"; + public static final String OPPLAYER4_WRITE1 = "ctrlDown"; + public static final String OPPLAYER4_METHOD_NAME1 = "bg"; + public static final String OPPLAYER4_WRITE2 = "playerIndex"; + public static final String OPPLAYER4_METHOD_NAME2 = "mp"; + public static final String[][] OPPLAYER4_WRITES = new String[][]{ + {"v"}, + {"r 8", "a 128"}, + }; + public static final String OPPLAYER5_OBFUSCATEDNAME = "bc"; + public static final String OPPLAYER5_WRITE1 = "ctrlDown"; + public static final String OPPLAYER5_METHOD_NAME1 = "bg"; + public static final String OPPLAYER5_WRITE2 = "playerIndex"; + public static final String OPPLAYER5_METHOD_NAME2 = "kl"; + public static final String[][] OPPLAYER5_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPPLAYER6_OBFUSCATEDNAME = "ai"; + public static final String OPPLAYER6_WRITE1 = "playerIndex"; + public static final String OPPLAYER6_METHOD_NAME1 = "kl"; + public static final String OPPLAYER6_WRITE2 = "ctrlDown"; + public static final String OPPLAYER6_METHOD_NAME2 = "bg"; + public static final String[][] OPPLAYER6_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"v"}, + }; + public static final String OPPLAYER7_OBFUSCATEDNAME = "ce"; + public static final String OPPLAYER7_WRITE1 = "playerIndex"; + public static final String OPPLAYER7_METHOD_NAME1 = "kl"; + public static final String OPPLAYER7_WRITE2 = "ctrlDown"; + public static final String OPPLAYER7_METHOD_NAME2 = "dg"; + public static final String[][] OPPLAYER7_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"a 128"}, + }; + public static final String OPPLAYER8_OBFUSCATEDNAME = "bp"; + public static final String OPPLAYER8_WRITE1 = "ctrlDown"; + public static final String OPPLAYER8_METHOD_NAME1 = "bg"; + public static final String OPPLAYER8_WRITE2 = "playerIndex"; + public static final String OPPLAYER8_METHOD_NAME2 = "kl"; + public static final String[][] OPPLAYER8_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPPLAYERT_OBFUSCATEDNAME = "ds"; + public static final String OPPLAYERT_WRITE1 = "playerIndex"; + public static final String OPPLAYERT_METHOD_NAME1 = "mp"; + public static final String OPPLAYERT_WRITE2 = "slot"; + public static final String OPPLAYERT_METHOD_NAME2 = "dy"; + public static final String OPPLAYERT_WRITE3 = "widgetId"; + public static final String OPPLAYERT_METHOD_NAME3 = "es"; + public static final String OPPLAYERT_WRITE4 = "ctrlDown"; + public static final String OPPLAYERT_METHOD_NAME4 = "dh"; + public static final String OPPLAYERT_WRITE5 = "itemId"; + public static final String OPPLAYERT_METHOD_NAME5 = "kl"; + public static final String[][] OPPLAYERT_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v", "r 8"}, + {"r 16", "r 24", "v", "r 8"}, + {"s 128"}, + {"a 128", "r 8"}, + }; + + public static final String OPHELDD_OBFUSCATEDNAME = "di"; + public static final String OPHELDD_WRITE1 = "selectedItemId"; + public static final String OPHELDD_METHOD_NAME1 = "bt"; + public static final String OPHELDD_WRITE2 = "destChildIndex"; + public static final String OPHELDD_METHOD_NAME2 = "dy"; + public static final String OPHELDD_WRITE3 = "destItemId"; + public static final String OPHELDD_METHOD_NAME3 = "dy"; + public static final String OPHELDD_WRITE4 = "selectedId"; + public static final String OPHELDD_METHOD_NAME4 = "en"; + public static final String OPHELDD_WRITE5 = "selectedChildIndex"; + public static final String OPHELDD_METHOD_NAME5 = "kl"; + public static final String OPHELDD_WRITE6 = "destId"; + public static final String OPHELDD_METHOD_NAME6 = "eg"; + public static final String[][] OPHELDD_WRITES = new String[][] { + {"r 8", "v"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"v", "r 8", "r 16", "r 24"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"} + }; + public static final String RESUME_COUNTDIALOG_OBFUSCATEDNAME = "au"; + public static final String RESUME_COUNTDIALOG_WRITE1 = "var0"; + public static final String RESUME_COUNTDIALOG_METHOD_NAME1 = "bu"; + public static final String[][] RESUME_COUNTDIALOG_WRITES = new String[][]{ + {"r 24", "r 16", "r 8", "v"}, + }; + public static final String RESUME_PAUSEBUTTON_OBFUSCATEDNAME = "bj"; + public static final String RESUME_PAUSEBUTTON_WRITE1 = "var1"; + public static final String RESUME_PAUSEBUTTON_METHOD_NAME1 = "kl"; + public static final String RESUME_PAUSEBUTTON_WRITE2 = "var0"; + public static final String RESUME_PAUSEBUTTON_METHOD_NAME2 = "es"; + public static final String[][] RESUME_PAUSEBUTTON_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 16", "r 24", "v", "r 8"} + }; + + public static final String offsetMultiplier = "944624261"; + public static final String indexMultiplier = "-602712499"; + public static final String addNodeGarbageValue = "-41"; + public static final String getPacketBufferNodeGarbageValue = "-26977627"; + public static final String packetWriterFieldName = "cv"; + public static final String isaacCipherFieldName = "av"; + public static final String addNodeMethodName = "ac"; + public static final String clientPacketClassName = "mi"; + public static final String packetWriterClassName = "dw"; + public static final String classContainingGetPacketBufferNodeName = "lh"; + public static final String packetBufferNodeClassName = "mb"; + public static final String packetBufferFieldName = "ap"; + public static final String bufferOffsetField = "aa"; + public static final String bufferArrayField = "ay"; + public static final String MouseHandler_lastPressedTimeMillisClass = "bx"; + public static final String MouseHandler_lastPressedTimeMillisField = "ag"; + public static final String clientMillisField = "jp"; + public static final String mouseHandlerMillisMultiplier = "4013550640572753771"; + public static final String clientMillisMultiplier = "7881463686914378693"; + public static final int getAnimationMultiplier = 2116322795; + public static final int skullIconMultiplier = 0; + public static final String skullIconField = "null"; + + public static final int pathLengthMultiplier = 0; + public static final String pathLengthFieldName = "null"; + public static final String doActionClassName = "fy"; + public static final String doActionMethodName = "lu"; +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/ObjectAndType.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/ObjectAndType.java new file mode 100644 index 0000000..205b9e7 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/ObjectAndType.java @@ -0,0 +1,11 @@ +package ee.futur.baseapi.nono.packets.utils; + +public class ObjectAndType { + Object object; + Class type; + + public ObjectAndType(Object object, Class type) { + this.object = object; + this.type = type; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketDef.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketDef.java new file mode 100644 index 0000000..e3dfb17 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketDef.java @@ -0,0 +1,232 @@ +package ee.futur.baseapi.nono.packets.utils; + +public class PacketDef { + public final String name; + public final String[] writeData; + public final String[][] writeMethods; + public final PacketType type; + PacketDef(String var1, String[] writeData, String[][] writeMethods, PacketType type) { + this.name = var1; + this.writeData = writeData; + this.writeMethods = writeMethods; + this.type = type; + } + + public static PacketDef getOpObj1() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJ1_WRITE1, ObfuscatedNames.OPOBJ1_WRITE2, ObfuscatedNames.OPOBJ1_WRITE3, ObfuscatedNames.OPOBJ1_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPOBJ1_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJ1_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJ); + } + + public static PacketDef getOpObj5() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJ5_WRITE1, ObfuscatedNames.OPOBJ5_WRITE2, ObfuscatedNames.OPOBJ5_WRITE3, ObfuscatedNames.OPOBJ5_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPOBJ5_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJ5_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJ); + } + + + public static PacketDef getOpObj4() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJ4_WRITE1, ObfuscatedNames.OPOBJ4_WRITE2, ObfuscatedNames.OPOBJ4_WRITE3, ObfuscatedNames.OPOBJ4_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPOBJ4_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJ4_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJ); + } + + + public static PacketDef getOpObj3() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJ3_WRITE1, ObfuscatedNames.OPOBJ3_WRITE2, ObfuscatedNames.OPOBJ3_WRITE3, ObfuscatedNames.OPOBJ3_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPOBJ3_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJ3_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJ); + } + + + public static PacketDef getOpObj2() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJ2_WRITE1, ObfuscatedNames.OPOBJ2_WRITE2, ObfuscatedNames.OPOBJ2_WRITE3, ObfuscatedNames.OPOBJ2_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPOBJ2_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJ2_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJ); + } + + + public static PacketDef getOpLocT() { + String[] writeData = new String[]{ObfuscatedNames.OPLOCT_WRITE1, ObfuscatedNames.OPLOCT_WRITE2, ObfuscatedNames.OPLOCT_WRITE3, ObfuscatedNames.OPLOCT_WRITE4, ObfuscatedNames.OPLOCT_WRITE5, ObfuscatedNames.OPLOCT_WRITE6, ObfuscatedNames.OPLOCT_WRITE7}; + String[][] writeMethods = ObfuscatedNames.OPLOCT_WRITES; + return new PacketDef(ObfuscatedNames.OPLOCT_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOCT); + } + + public static PacketDef getOpNpcT() { + String[] writeData = new String[]{ObfuscatedNames.OPNPCT_WRITE1, ObfuscatedNames.OPNPCT_WRITE2, ObfuscatedNames.OPNPCT_WRITE3,ObfuscatedNames.OPNPCT_WRITE4,ObfuscatedNames.OPNPCT_WRITE5}; + String[][] writeMethods = ObfuscatedNames.OPNPCT_WRITES; + return new PacketDef(ObfuscatedNames.OPNPCT_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPCT); + } + + public static PacketDef getOpPlayerT() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYERT_WRITE1, ObfuscatedNames.OPPLAYERT_WRITE2, ObfuscatedNames.OPPLAYERT_WRITE3, ObfuscatedNames.OPPLAYERT_WRITE4, ObfuscatedNames.OPPLAYERT_WRITE5}; + String[][] writeMethods = ObfuscatedNames.OPPLAYERT_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYERT_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYERT); + } + + public static PacketDef getOpObjT() { + String[] writeData = new String[]{ObfuscatedNames.OPOBJT_WRITE1, ObfuscatedNames.OPOBJT_WRITE2, ObfuscatedNames.OPOBJT_WRITE3, ObfuscatedNames.OPOBJT_WRITE4, ObfuscatedNames.OPOBJT_WRITE5, ObfuscatedNames.OPOBJT_WRITE6, ObfuscatedNames.OPOBJT_WRITE7}; + String[][] writeMethods = ObfuscatedNames.OPOBJT_WRITES; + return new PacketDef(ObfuscatedNames.OPOBJT_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPOBJT); + } + + public static PacketDef getIfButtonT() { + String[] writeData = new String[]{ObfuscatedNames.IF_BUTTONT_WRITE1, ObfuscatedNames.IF_BUTTONT_WRITE2, ObfuscatedNames.IF_BUTTONT_WRITE3, ObfuscatedNames.IF_BUTTONT_WRITE4, ObfuscatedNames.IF_BUTTONT_WRITE5, ObfuscatedNames.IF_BUTTONT_WRITE6}; + String[][] writeMethods = ObfuscatedNames.IF_BUTTONT_WRITES; + return new PacketDef(ObfuscatedNames.IF_BUTTONT_OBFUSCATEDNAME, writeData, writeMethods, PacketType.IF_BUTTONT); + } + + public static PacketDef getOpNpc2() { + String[] writeData = new String[]{ObfuscatedNames.OPNPC2_WRITE1, ObfuscatedNames.OPNPC2_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPNPC2_WRITES; + return new PacketDef(ObfuscatedNames.OPNPC2_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPC); + } + + public static PacketDef getOpPlayer6() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER6_WRITE1, ObfuscatedNames.OPPLAYER6_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER6_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER6_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpNpc3() { + String[] writeData = new String[]{ObfuscatedNames.OPNPC3_WRITE1, ObfuscatedNames.OPNPC3_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPNPC3_WRITES; + return new PacketDef(ObfuscatedNames.OPNPC3_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPC); + } + + public static PacketDef getOpPlayer7() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER7_WRITE1, ObfuscatedNames.OPPLAYER7_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER7_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER7_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpLoc2() { + String[] writeData = new String[]{ObfuscatedNames.OPLOC2_WRITE1, ObfuscatedNames.OPLOC2_WRITE2, ObfuscatedNames.OPLOC2_WRITE3, ObfuscatedNames.OPLOC2_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPLOC2_WRITES; + return new PacketDef(ObfuscatedNames.OPLOC2_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOC); + } + + public static PacketDef getOpPlayer8() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER8_WRITE1, ObfuscatedNames.OPPLAYER8_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER8_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER8_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpLoc1() { + String[] writeData = new String[]{ObfuscatedNames.OPLOC1_WRITE1, ObfuscatedNames.OPLOC1_WRITE2, ObfuscatedNames.OPLOC1_WRITE3, ObfuscatedNames.OPLOC1_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPLOC1_WRITES; + return new PacketDef(ObfuscatedNames.OPLOC1_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOC); + } + + public static PacketDef getOpNpc1() { + String[] writeData = new String[]{ObfuscatedNames.OPNPC1_WRITE1, ObfuscatedNames.OPNPC1_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPNPC1_WRITES; + return new PacketDef(ObfuscatedNames.OPNPC1_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPC); + } + + public static PacketDef getOpLoc4() { + String[] writeData = new String[]{ObfuscatedNames.OPLOC4_WRITE1, ObfuscatedNames.OPLOC4_WRITE2, ObfuscatedNames.OPLOC4_WRITE3, ObfuscatedNames.OPLOC4_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPLOC4_WRITES; + return new PacketDef(ObfuscatedNames.OPLOC4_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOC); + } + + public static PacketDef getOpPlayer2() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER2_WRITE1, ObfuscatedNames.OPPLAYER2_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER2_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER2_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpLoc3() { + String[] writeData = new String[]{ObfuscatedNames.OPLOC3_WRITE1, ObfuscatedNames.OPLOC3_WRITE2, ObfuscatedNames.OPLOC3_WRITE3, ObfuscatedNames.OPLOC3_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPLOC3_WRITES; + return new PacketDef(ObfuscatedNames.OPLOC3_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOC); + } + + public static PacketDef getOpPlayer3() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER3_WRITE1, ObfuscatedNames.OPPLAYER3_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER3_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER3_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpNpc4() { + String[] writeData = new String[]{ObfuscatedNames.OPNPC4_WRITE1, ObfuscatedNames.OPNPC4_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPNPC4_WRITES; + return new PacketDef(ObfuscatedNames.OPNPC4_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPC); + } + + public static PacketDef getOpPlayer4() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER4_WRITE1, ObfuscatedNames.OPPLAYER4_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER4_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER4_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpNpc5() { + String[] writeData = new String[]{ObfuscatedNames.OPNPC5_WRITE1, ObfuscatedNames.OPNPC5_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPNPC5_WRITES; + return new PacketDef(ObfuscatedNames.OPNPC5_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPNPC); + } + + public static PacketDef getOpPlayer5() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER5_WRITE1, ObfuscatedNames.OPPLAYER5_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER5_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER5_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getOpLoc5() { + String[] writeData = new String[]{ObfuscatedNames.OPLOC5_WRITE1, ObfuscatedNames.OPLOC5_WRITE2, ObfuscatedNames.OPLOC5_WRITE3, ObfuscatedNames.OPLOC5_WRITE4}; + String[][] writeMethods = ObfuscatedNames.OPLOC5_WRITES; + return new PacketDef(ObfuscatedNames.OPLOC5_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPLOC); + } + + public static PacketDef getOpPlayer1() { + String[] writeData = new String[]{ObfuscatedNames.OPPLAYER1_WRITE1, ObfuscatedNames.OPPLAYER1_WRITE2}; + String[][] writeMethods = ObfuscatedNames.OPPLAYER1_WRITES; + return new PacketDef(ObfuscatedNames.OPPLAYER1_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPPLAYER); + } + + public static PacketDef getMoveGameClick() { + String[] writeData = new String[]{ObfuscatedNames.MOVE_GAMECLICK_WRITE1, ObfuscatedNames.MOVE_GAMECLICK_WRITE2, ObfuscatedNames.MOVE_GAMECLICK_WRITE3, ObfuscatedNames.MOVE_GAMECLICK_WRITE4}; + String[][] writeMethods = ObfuscatedNames.MOVE_GAMECLICK_WRITES; + return new PacketDef(ObfuscatedNames.MOVE_GAMECLICK_OBFUSCATEDNAME, writeData, writeMethods, PacketType.MOVE_GAMECLICK); + } + + public static PacketDef getEventMouseClick() { + String[] writeData = new String[]{ObfuscatedNames.EVENT_MOUSE_CLICK_WRITE1, ObfuscatedNames.EVENT_MOUSE_CLICK_WRITE2, ObfuscatedNames.EVENT_MOUSE_CLICK_WRITE3, ObfuscatedNames.EVENT_MOUSE_CLICK_WRITE4}; + String[][] writeMethods = ObfuscatedNames.EVENT_MOUSE_CLICK_WRITES; + return new PacketDef(ObfuscatedNames.EVENT_MOUSE_CLICK_OBFUSCATEDNAME, writeData, writeMethods, PacketType.EVENT_MOUSE_CLICK); + } + + + public static PacketDef getIfSubOp() { + String[] writeData = new String[]{ObfuscatedNames.IF_SUBOP_WRITE1, ObfuscatedNames.IF_SUBOP_WRITE2, ObfuscatedNames.IF_SUBOP_WRITE3, + ObfuscatedNames.IF_SUBOP_WRITE4, ObfuscatedNames.IF_SUBOP_WRITE5}; + String[][] writeMethods = ObfuscatedNames.IF_SUBOP_WRITES; + return new PacketDef(ObfuscatedNames.IF_SUBOP_OBFUSCATEDNAME, writeData, writeMethods, PacketType.IF_SUBOP); + } + + public static PacketDef getResumePausebutton() { + String[] writeData = new String[]{ObfuscatedNames.RESUME_PAUSEBUTTON_WRITE1, ObfuscatedNames.RESUME_PAUSEBUTTON_WRITE2}; + String[][] writeMethods = ObfuscatedNames.RESUME_PAUSEBUTTON_WRITES; + return new PacketDef(ObfuscatedNames.RESUME_PAUSEBUTTON_OBFUSCATEDNAME, writeData, writeMethods, PacketType.RESUME_PAUSEBUTTON); + } + + public static PacketDef getResumeCountDialog() { + String[] writeData = new String[]{ObfuscatedNames.RESUME_COUNTDIALOG_WRITE1}; + String[][] writeMethods = ObfuscatedNames.RESUME_COUNTDIALOG_WRITES; + return new PacketDef(ObfuscatedNames.RESUME_COUNTDIALOG_OBFUSCATEDNAME, writeData, writeMethods, PacketType.RESUME_COUNTDIALOG); + } + + public static PacketDef getOpHeldd() { + String[] writeData = new String[]{ObfuscatedNames.OPHELDD_WRITE1, ObfuscatedNames.OPHELDD_WRITE2, ObfuscatedNames.OPHELDD_WRITE3, + ObfuscatedNames.OPHELDD_WRITE4, ObfuscatedNames.OPHELDD_WRITE5, ObfuscatedNames.OPHELDD_WRITE6}; + String[][] writeMethods = ObfuscatedNames.OPHELDD_WRITES; + return new PacketDef(ObfuscatedNames.OPHELDD_OBFUSCATEDNAME, writeData, writeMethods, PacketType.OPHELDD); + } + + public static PacketDef getIfButtonX() { + String[] writeData = new String[]{ObfuscatedNames.IF_BUTTONX_WRITE1, ObfuscatedNames.IF_BUTTONX_WRITE2, ObfuscatedNames.IF_BUTTONX_WRITE3, + ObfuscatedNames.IF_BUTTONX_WRITE4}; + String[][] writeMethods = ObfuscatedNames.IF_BUTTONX_WRITES; + return new PacketDef(ObfuscatedNames.IF_BUTTONX_OBFUSCATEDNAME, writeData, writeMethods, PacketType.IF_BUTTONX); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketReflection.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketReflection.java new file mode 100644 index 0000000..722196f --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketReflection.java @@ -0,0 +1,290 @@ +package ee.futur.baseapi.nono.packets.utils; + +import ee.futur.baseapi.nono.packets.BufferMethods; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.client.RuneLite; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class PacketReflection { + public static Client getClient() { + return RuneLite.getInjector().getInstance(Client.class); + } + + public static Class loadClassFromClientClassLoader(String name) { + try { + ClassLoader clientLoader = getClient().getClass().getClassLoader(); + return clientLoader.loadClass(name); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return null; + } + + public static Class getClassWithGetPacketBufferNode() { + return loadClassFromClientClassLoader(ObfuscatedNames.classContainingGetPacketBufferNodeName); + } + + public static Method getGetPacketBufferNode() { + try { + return Arrays.stream(getClassWithGetPacketBufferNode().getDeclaredMethods()).filter(m -> m.getReturnType().equals(getPacketBufferNodeClass())).collect(Collectors.toList()).get(0); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static Class getClientPacketClass() { + return loadClassFromClientClassLoader(ObfuscatedNames.clientPacketClassName); + } + + public static Field getPacketWriterField() { + try { + return getClient().getClass().getDeclaredField(ObfuscatedNames.packetWriterFieldName); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return null; + } + + public static Class getPacketWriterClass() { + try { + Field packetWriterField = getPacketWriterField(); + packetWriterField.setAccessible(true); + Class packetWriterClass = packetWriterField.get(null).getClass(); + packetWriterField.setAccessible(false); + return packetWriterClass; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + public static Object getIsaacObject() { + try { + Field isaacField = getPacketWriterClass().getDeclaredField(ObfuscatedNames.isaacCipherFieldName); + isaacField.setAccessible(true); + Object isaacObject = isaacField.get(getPacketWriteObject()); + isaacField.setAccessible(false); + return isaacObject; + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + public static Class getIsaacClass() { + return getIsaacObject().getClass(); + } + + public static Class getPacketBufferNodeClass() { + return loadClassFromClientClassLoader(ObfuscatedNames.packetBufferNodeClassName); + } + + public static Object getPacketWriteObject() { + Field packetWriterField = getPacketWriterField(); + packetWriterField.setAccessible(true); + try { + Object packetWriter = packetWriterField.get(null); + packetWriterField.setAccessible(false); + return packetWriter; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + + public static void sendPacket(PacketDef def, Object... objects) { + Object packetBufferNode = null; + Method getPacketBufferNode = getGetPacketBufferNode(); + Class ClientPacket = getClientPacketClass(); + Object isaac = getIsaacObject(); + getPacketBufferNode.setAccessible(true); + long garbageValue = Math.abs(Long.parseLong(ObfuscatedNames.getPacketBufferNodeGarbageValue)); + if (garbageValue < 256) { + try { + packetBufferNode = getPacketBufferNode.invoke(null, fetchPacketField(def.name).get(ClientPacket), + isaac, Byte.parseByte(ObfuscatedNames.getPacketBufferNodeGarbageValue)); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } else if (garbageValue < 32768) { + try { + //System.out.println("getPacketBufferNode: "+getPacketBufferNode); + //System.out.println("isaac: "+isaac); + packetBufferNode = getPacketBufferNode.invoke(null, fetchPacketField(def.name).get(ClientPacket), + isaac, Short.parseShort(ObfuscatedNames.getPacketBufferNodeGarbageValue)); + //System.out.println("packetBufferNode: "+packetBufferNode); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } else if (garbageValue < Integer.MAX_VALUE) { + try { + packetBufferNode = getPacketBufferNode.invoke(null, fetchPacketField(def.name).get(ClientPacket), + isaac, Integer.parseInt(ObfuscatedNames.getPacketBufferNodeGarbageValue)); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + Object buffer = null; + try { + buffer = packetBufferNode.getClass().getDeclaredField(ObfuscatedNames.packetBufferFieldName).get(packetBufferNode); + } catch (IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + getPacketBufferNode.setAccessible(false); + List params = null; + if (def.type == PacketType.OPHELDD) { + params = List.of("selectedId", "selectedChildIndex", "selectedItemId", "destId", "destChildIndex", "destItemId"); + } + if (def.type == PacketType.RESUME_COUNTDIALOG) { + params = List.of("var0"); + } + if (def.type == PacketType.RESUME_PAUSEBUTTON) { + params = List.of("var0", "var1"); + } + if (def.type == PacketType.IF_BUTTON) { + params = List.of("widgetId", "slot", "itemId"); + } + if (def.type == PacketType.IF_BUTTONX) { + params = List.of("widgetId", "slot", "itemId", "opCode"); + } + if (def.type == PacketType.IF_SUBOP) { + params = List.of("widgetId", "slot", "itemId", "menuIndex", "subActionIndex"); + } + if (def.type == PacketType.OPLOC) { + params = List.of("objectId", "worldPointX", "worldPointY", "ctrlDown"); + } + if (def.type == PacketType.OPNPC) { + params = List.of("npcIndex", "ctrlDown"); + } + if (def.type == PacketType.OPPLAYER) { + params = List.of("playerIndex", "ctrlDown"); + } + if (def.type == PacketType.OPOBJ) { + params = List.of("objectId", "worldPointX", "worldPointY", "ctrlDown"); + } + if (def.type == PacketType.OPOBJT) { + params = List.of("objectId", "worldPointX", "worldPointY", "slot", "itemId", "widgetId", + "ctrlDown"); + } + if (def.type == PacketType.EVENT_MOUSE_CLICK) { + params = List.of("mouseInfo", "mouseX", "mouseY", "0"); + } + if (def.type == PacketType.MOVE_GAMECLICK) { + params = List.of("worldPointX", "worldPointY", "ctrlDown", "5"); + } + if (def.type == PacketType.IF_BUTTONT) { + params = List.of("sourceWidgetId", "sourceSlot", "sourceItemId", "destinationWidgetId", + "destinationSlot", "destinationItemId"); + } + if (def.type == PacketType.OPLOCT) { + params = List.of("objectId", "worldPointX", "worldPointY", "slot", "itemId", "widgetId", + "ctrlDown"); + } + if (def.type == PacketType.OPPLAYERT) { + params = List.of("playerIndex", "itemId", "slot", "widgetId", "ctrlDown"); + } + if (def.type == PacketType.OPNPCT) { + params = List.of("npcIndex", "itemId", "slot", "widgetId", "ctrlDown"); + } + if (params != null) { + for (int i = 0; i < def.writeData.length; i++) { + int index = params.indexOf(def.writeData[i]); + Object writeValue = objects[index]; + for (String s : def.writeMethods[i]) { +// System.out.println("Writing " + s + " " + writeValue); + BufferMethods.writeValue(s, (Integer) writeValue, buffer); + } + } + Field PACKETWRITER = getPacketWriterField(); + PACKETWRITER.setAccessible(true); + try { + //System.out.println(PACKETWRITER); + //System.out.println(PACKETWRITER.get(null)); + addNode(PACKETWRITER.get(null), packetBufferNode); + } catch (Exception e) { + e.printStackTrace(); + } + PACKETWRITER.setAccessible(false); + } + } + + public static void addNode(Object packetWriter, Object packetBufferNode) { + if (PacketUtilsPlugin.usingClientAddNode) { + try { + Method addNode = null; + long garbageValue = Math.abs(Long.parseLong(ObfuscatedNames.addNodeGarbageValue)); + if (garbageValue < 256) { + addNode = packetWriter.getClass().getDeclaredMethod(ObfuscatedNames.addNodeMethodName, packetBufferNode.getClass(), byte.class); + addNode.setAccessible(true); + addNode.invoke(packetWriter, packetBufferNode, Byte.parseByte(ObfuscatedNames.addNodeGarbageValue)); + } else if (garbageValue < 32768) { + addNode = packetWriter.getClass().getDeclaredMethod(ObfuscatedNames.addNodeMethodName, packetBufferNode.getClass(), short.class); + addNode.setAccessible(true); + addNode.invoke(packetWriter, packetBufferNode, Short.parseShort(ObfuscatedNames.addNodeGarbageValue)); + } else if (garbageValue < Integer.MAX_VALUE) { + addNode = packetWriter.getClass().getDeclaredMethod(ObfuscatedNames.addNodeMethodName, packetBufferNode.getClass(), int.class); + //System.out.println("addnode: "+addNode); + addNode.setAccessible(true); + addNode.invoke(packetWriter, packetBufferNode, Integer.parseInt(ObfuscatedNames.addNodeGarbageValue)); + } + if (addNode != null) { + addNode.setAccessible(false); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + try { + Method addNode = PacketUtilsPlugin.addNodeMethod; + addNode.setAccessible(true); + if (addNode.getParameterCount() == 2) { + addNode.invoke(null, packetWriter, packetBufferNode); + } else { + long garbageValue = Math.abs(Long.parseLong(ObfuscatedNames.addNodeGarbageValue)); + if (garbageValue < 256) { + addNode.invoke(null, packetWriter, packetBufferNode, Byte.parseByte(ObfuscatedNames.addNodeGarbageValue)); + } else if (garbageValue < 32768) { + addNode.invoke(null, packetWriter, packetBufferNode, Short.parseShort(ObfuscatedNames.addNodeGarbageValue)); + } else if (garbageValue < Integer.MAX_VALUE) { + addNode.invoke(null, packetWriter, packetBufferNode, Integer.parseInt(ObfuscatedNames.addNodeGarbageValue)); + } + } + addNode.setAccessible(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + static Field fetchPacketField(String name) { + try { + Class ClientPacket = getClientPacketClass(); + return ClientPacket.getDeclaredField(name); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + return null; + } + } + + + private static BigInteger modInverse(BigInteger val) { + BigInteger shift = BigInteger.ONE.shiftLeft(32); + return val.modInverse(shift); + } + + private static int modInverse(int val) { + return modInverse(BigInteger.valueOf(val)).intValue(); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketType.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketType.java new file mode 100644 index 0000000..64484da --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketType.java @@ -0,0 +1,21 @@ +package ee.futur.baseapi.nono.packets.utils; + +public enum PacketType { + OPHELDD, + RESUME_COUNTDIALOG, + RESUME_PAUSEBUTTON, + IF_BUTTON, + IF_SUBOP, + IF_BUTTONX, + OPNPC, + OPPLAYER, + OPOBJ, + OPLOC, + MOVE_GAMECLICK, + EVENT_MOUSE_CLICK, + IF_BUTTONT, + OPNPCT, + OPPLAYERT, + OPOBJT, + OPLOCT +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsConfig.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsConfig.java new file mode 100644 index 0000000..25ac8e5 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsConfig.java @@ -0,0 +1,27 @@ +package ee.futur.baseapi.nono.packets.utils; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("PacketUtils") +public interface PacketUtilsConfig extends Config { + @ConfigItem( + keyName = "debug", + name = "debug", + description = "enable menuaction debug output" + ) + default boolean debug() { + return false; + } + + @ConfigItem( + keyName = "alwaysOn", + name = "Always enabled.", + description = "Makes this plugin always enabled on startup if the revision matches." + ) + default boolean alwaysOn() { + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsPlugin.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsPlugin.java new file mode 100644 index 0000000..3437929 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/PacketUtilsPlugin.java @@ -0,0 +1,336 @@ +package ee.futur.baseapi.nono.packets.utils; + +import com.google.inject.Provides; +import com.google.inject.Singleton; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.client.RuneLite; +import net.runelite.client.RuneLiteProperties; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginInstantiationException; +import net.runelite.client.plugins.PluginManager; + +import javax.inject.Inject; +import javax.swing.*; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.*; +import java.util.jar.JarFile; +import java.util.stream.Collectors; + +@Slf4j +@Singleton +@PluginDescriptor( + name = "Packet Utils", + description = "Packet Utils for Plugins", + enabledByDefault = true, + tags = {"ethan"} +) +public class PacketUtilsPlugin extends Plugin { + @Inject + PacketUtilsConfig config; + @Inject + Client client; + static Client staticClient; + public static Method addNodeMethod; + public static boolean usingClientAddNode = false; + public static final int CLIENT_REV = 232; + private static String loadedConfigName = ""; + @Inject + private PluginManager pluginManager; + + @Provides + public PacketUtilsConfig getConfig(ConfigManager configManager) { + return configManager.getConfig(PacketUtilsConfig.class); + } + + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked e) { + if (config.debug()) { + client.addChatMessage(ChatMessageType.GAMEMESSAGE, "Packet Utils", e.toString(), null); + System.out.println(e); + } + } + + + @Override + @SneakyThrows + public void startUp() { + staticClient = client; + if (client.getRevision() != CLIENT_REV) { + SwingUtilities.invokeLater(() -> + { + JOptionPane.showMessageDialog(null, "PacketUtils not updated for this rev please " + + "wait for " + + "plugin update"); + try { + pluginManager.setPluginEnabled(this, false); + pluginManager.stopPlugin(this); + } catch (PluginInstantiationException ignored) { + } + }); + return; + } + //setupNeverlog(); + int feature = Runtime.version().feature(); + if (feature != 11) { + for (int i = 0; i < 10; i++) { + log.error("ETHAN VANN PLUGINS LOADED ON JAVA != 11 THIS IS NOT SUPPORTED"); + log.error("DEVELOPERS SHOULD IGNORE BUG REPORTS CONTAINING THIS LINE UNTIL THIS ISSUE IS RESOLVED"); + } + } else { + log.info("Ethan Vann Plugins loaded on Java 11"); + } + //setupRuneliteUpdateHandling(RuneLiteProperties.getVersion()); + cleanup(); + SwingUtilities.invokeLater(() -> + { + for (Plugin plugin : pluginManager.getPlugins()) { + if (plugin.getName().equals("BaseApiPlugin")) { + if (pluginManager.isPluginEnabled(plugin)) { + continue; + } + try { + pluginManager.setPluginEnabled(plugin, true); + pluginManager.startPlugin(plugin); + } catch (PluginInstantiationException e) { + //e.printStackTrace(); + } + } + } + }); + } + + @SneakyThrows + public static void setupNeverlog() { + staticClient.setIdleTimeout(42069); + for (Field declaredField : staticClient.getClass().getDeclaredFields()) { + if (declaredField.getType() == int.class && Modifier.isStatic(declaredField.getModifiers())) { + declaredField.setAccessible(true); + int value = declaredField.getInt(null); + if (value != 42069) { + declaredField.setAccessible(false); + continue; + } + System.out.println("found idle ticks field: " + declaredField.getName()); + declaredField.setInt(null, Integer.MAX_VALUE); + declaredField.setAccessible(false); + } + } + } + + @SneakyThrows + public void cleanup() { + if (!loadedConfigName.equals(makeString())) { + for (int i = 0; i < 10; i++) { + log.error("ETHAN VANN PLUGINS LOADED WITH INCORRECT CONFIG DATA THIS IS NOT SUPPORTED"); + log.error("DEVELOPERS SHOULD IGNORE BUG REPORTS CONTAINING THIS LINE UNTIL THIS ISSUE IS RESOLVED"); + } + } else { + log.info("config loaded from correct path"); + } + Path codeSource = RuneLite.RUNELITE_DIR.toPath().resolve("PacketUtils"); + List toDelete = new ArrayList<>(); + toDelete.add(codeSource.resolve("vanilla.jar")); + toDelete.add(codeSource.resolve("patched.jar")); + toDelete.add(codeSource.resolve("doAction.class")); + toDelete.add(codeSource.resolve("decompiled.txt")); + for (Path path : toDelete) { + Files.deleteIfExists(path); + } + } + + @SneakyThrows + public void setupRuneliteUpdateHandling(String version) { + Path codeSource = RuneLite.RUNELITE_DIR.toPath().resolve("PacketUtils"); + if (Files.exists(codeSource.resolve(version + "-" + client.getRevision() + ".txt"))) { + Path f = codeSource.resolve(version + "-" + client.getRevision() + ".txt"); + List lines = Files.readAllLines(f); + loadedConfigName = f.getFileName().toString(); + System.out.println("config name: " + loadedConfigName); + if (lines.size() < 2) { + return; + } + usingClientAddNode = Boolean.parseBoolean(lines.get(0)); + if (usingClientAddNode) { + log.info("loaded addNode config from file"); + log.info("usingClientAddNode: " + usingClientAddNode); + log.info("addNodeMethod: " + "N/A"); + return; + } + String[] split = lines.get(1).split("\\."); + Class addNodeClassName = client.getClass().getClassLoader().loadClass(split[0]); + for (Method declaredMethod : addNodeClassName.getDeclaredMethods()) { + if (declaredMethod.getName().equals(split[1]) && declaredMethod.getParameterCount() > 0 && declaredMethod.getParameterTypes()[0].getSimpleName().equals(ObfuscatedNames.packetWriterClassName)) { + addNodeMethod = declaredMethod; + } + } + log.info("loaded addNode config from file"); + log.info("usingClientAddNode: " + usingClientAddNode); + log.info("addNodeMethod: " + addNodeMethod); + return; + } + String doActionClassName = ObfuscatedNames.doActionClassName; + String doActionMethodName = ObfuscatedNames.doActionMethodName; + System.out.print("finished"); + final String doActionFinalClassName = doActionClassName; + final String doActionFinalMethodName = doActionMethodName; + System.out.println(doActionFinalClassName); + System.out.println(doActionFinalMethodName); + URL rlConfigURL = new URL("https://static.runelite.net/jav_config.ws"); + if (!codeSource.toFile().isDirectory()) { + Files.createDirectory(codeSource); + } + Path vanillaOutputPath = codeSource.resolve("vanilla.jar"); + Path patchedOutputPath = codeSource.resolve("patched.jar"); + Path doActionOutputPath = codeSource.resolve("doAction.class"); + Path decompilationOutputPath = codeSource.resolve("decompiled.txt"); + System.out.println("Downloading vanilla client"); + downloadVanillaJar(vanillaOutputPath, rlConfigURL); + File vanilla = vanillaOutputPath.toFile(); + if (vanilla.exists()) { + log.info("Vanilla jar exists"); + } else { + log.info("Vanilla jar does not exist"); + } + + if (version.contains("SNAPSHOT")) { + log.info("replacing snapshot version"); + version = version.replace("-SNAPSHOT", ""); + } + + String[] versionSplits = version.split("\\."); + int length = versionSplits.length; + + if ((length > 0 && Integer.parseInt(versionSplits[0]) > 1 || (length > 1) && (Integer.parseInt(versionSplits[1]) > 10) )|| (length > 2 && Integer.parseInt(versionSplits[2]) > 34)) { + String url = "https://repo.runelite.net/net/runelite/injected-client/" + version + "/injected-client-" + version + ".jar"; + URL injectedURL = new URL(url); + log.info("Downloading injected client from " + injectedURL); + try (InputStream clientStream = injectedURL.openStream()) { + Files.copy(clientStream, patchedOutputPath, StandardCopyOption.REPLACE_EXISTING); + } + } else { + System.out.println("unsupported rl version"); + throw new UnsupportedOperationException("unsupported rl version"); + } + System.out.println(doActionFinalClassName); + try (JarFile patchedJar = new JarFile(patchedOutputPath.toFile())) { + patchedJar.entries().asIterator().forEachRemaining(jarEntry -> { + //System.out.println("jar entry: " + jarEntry.getName()); + if (jarEntry.getName().equals(doActionFinalClassName + ".class")) { + try (InputStream inputStream = patchedJar.getInputStream(jarEntry)) { + Files.copy(inputStream, doActionOutputPath, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } + OutputStream decompilationOutputStream = Files.newOutputStream(decompilationOutputPath); + PrintStream s = new PrintStream(decompilationOutputStream); + System.setOut(s); + //Main.main(new String[]{doActionOutputPath.toAbsolutePath().toString(), "--methodname", doActionFinalMethodName}); + s.flush(); + s.close(); + decompilationOutputStream.close(); + System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); + File output = decompilationOutputPath.toFile(); + BufferedReader reader = new BufferedReader(new FileReader(output)); + List lines = reader.lines().collect(Collectors.toList()); + String previousLine = null; + ArrayList methodCalls = new ArrayList<>(); + for (String line : lines) { + if (line.length() < 300) { + if (line.contains("}")) { + if (previousLine != null && previousLine.contains("(")) { + methodCalls.add(previousLine.split("\\(")[0].trim()); + } + } + previousLine = line; + } + } + reader.close(); + String mostUsedMethod = methodCalls.stream() + .filter(str -> !str.contains("** while")) + .collect(Collectors.groupingBy(str -> str, Collectors.counting())) + .entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .findFirst().get().getKey(); + if (mostUsedMethod.contains("client")) { + usingClientAddNode = true; + } else { + String[] split = mostUsedMethod.split("\\."); + Class addNodeClassName = client.getClass().getClassLoader().loadClass(split[0]); + for (Method declaredMethod : addNodeClassName.getDeclaredMethods()) { + if (declaredMethod.getName().equals(split[1]) && declaredMethod.getParameterTypes()[0].getSimpleName().equals(ObfuscatedNames.packetWriterClassName)) { + addNodeMethod = declaredMethod; + } + } + } + for (String line : lines) { + if (line.contains(mostUsedMethod)) { + log.info("found addNode method call example " + line.trim()); + String stringOutput = usingClientAddNode + + "\n" + + mostUsedMethod; + Path config = Files.write(Files.createFile(codeSource.resolve(version + "-" + client.getRevision() + ".txt")), stringOutput.getBytes(StandardCharsets.UTF_8)); + loadedConfigName = config.getFileName().toString(); + break; + } + } + } + + public static void downloadVanillaJar(Path vanillaOutputPath, URL rlConfigURL) throws IOException { + BufferedReader configReader = new BufferedReader(new InputStreamReader(rlConfigURL.openConnection().getInputStream())); + while (configReader.ready()) { + String line = configReader.readLine(); + if (line == null) { + continue; + } + if (line.contains("runelite.gamepack")) { + URL clientURL = new URL(line.split("=")[1]); + log.info("Downloading vanilla client from " + clientURL); + try (InputStream clientStream = clientURL.openStream()) { + Files.copy(clientStream, vanillaOutputPath, StandardCopyOption.REPLACE_EXISTING); + } + } + } + configReader.close(); + } + + @Override + public void shutDown() { + log.info("Shutdown"); + } + + @Inject + private void init() { + if (config.alwaysOn() && client.getRevision() == CLIENT_REV) { + SwingUtilities.invokeLater(() -> + { + try { + RuneLite.getInjector().getInstance(PluginManager.class).setPluginEnabled(this, true); + RuneLite.getInjector().getInstance(PluginManager.class).startPlugin(this); + } catch (PluginInstantiationException e) { + e.printStackTrace(); + } + }); + } + } + + public String makeString() { + return RuneLiteProperties.getVersion() + "-" + client.getRevision() + ".txt"; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetID.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetID.java new file mode 100644 index 0000000..3f10610 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetID.java @@ -0,0 +1,1412 @@ +/* + * Copyright (c) 2017, Adam + * 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 ee.futur.baseapi.nono.packets.utils; + +import net.runelite.api.widgets.WidgetInfo; + +/** + * Utility class mapping widget IDs to global constants. + *

+ * The constants defined directly under the {@link WidgetID} class are + * Widget group IDs. All child IDs are defined in sub-classes relating + * to their group. + *

+ * For a more direct group-child widget mapping, use the + * {@link WidgetInfo} enum class. + */ + +public final class WidgetID +{ + public static final int FAIRY_RING_PANEL_GROUP_ID = 381; + public static final int FAIRY_RING_GROUP_ID = 398; + public static final int LOGOUT_PANEL_ID = 182; + public static final int BANK_GROUP_ID = 12; + public static final int BANK_INVENTORY_GROUP_ID = 15; + public static final int GRAND_EXCHANGE_INVENTORY_GROUP_ID = 467; + public static final int GRAND_EXCHANGE_GROUP_ID = 465; + public static final int DEPOSIT_BOX_GROUP_ID = 192; + public static final int INVENTORY_GROUP_ID = 149; + public static final int PLAYER_TRADE_SCREEN_GROUP_ID = 335; + public static final int PLAYER_TRADE_INVENTORY_GROUP_ID = 336; + public static final int FRIENDS_LIST_GROUP_ID = 429; + public static final int IGNORE_LIST_GROUP_ID = 432; + public static final int RAIDING_PARTY_GROUP_ID = 500; + public static final int EQUIPMENT_GROUP_ID = 387; + public static final int EQUIPMENT_INVENTORY_GROUP_ID = 85; + public static final int EMOTES_GROUP_ID = 216; + public static final int RUNE_POUCH_GROUP_ID = 190; + public static final int ACHIEVEMENT_DIARY_GROUP_ID = 259; + public static final int PEST_CONTROL_BOAT_GROUP_ID = 407; + public static final int PEST_CONTROL_GROUP_ID = 408; + public static final int FRIENDS_CHAT_GROUP_ID = 7; + public static final int MINIMAP_GROUP_ID = 160; + public static final int LOGIN_CLICK_TO_PLAY_GROUP_ID = 378; + public static final int CLUE_SCROLL_GROUP_ID = 203; + public static final int FIXED_VIEWPORT_GROUP_ID = 548; + public static final int RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID = 161; + public static final int RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID = 164; + public static final int PRAYER_GROUP_ID = 541; + public static final int QUICK_PRAYERS_GROUP_ID = 77; + public static final int SHOP_GROUP_ID = 300; + public static final int SHOP_INVENTORY_GROUP_ID = 301; + public static final int SMITHING_GROUP_ID = 312; + public static final int GUIDE_PRICES_GROUP_ID = 464; + public static final int GUIDE_PRICES_INVENTORY_GROUP_ID = 238; + public static final int COMBAT_GROUP_ID = 593; + public static final int DIALOG_NPC_GROUP_ID = 231; + public static final int SLAYER_REWARDS_GROUP_ID = 426; + public static final int PRIVATE_CHAT = 163; + public static final int CHATBOX_GROUP_ID = 162; + public static final int VOLCANIC_MINE_GROUP_ID = 611; + public static final int BA_ATTACKER_GROUP_ID = 485; + public static final int BA_COLLECTOR_GROUP_ID = 486; + public static final int BA_DEFENDER_GROUP_ID = 487; + public static final int BA_HEALER_GROUP_ID = 488; + public static final int BA_REWARD_GROUP_ID = 497; + public static final int BA_TEAM_GROUP_ID = 256; + public static final int LEVEL_UP_GROUP_ID = 233; + public static final int DIALOG_SPRITE_GROUP_ID = 193; + public static final int QUEST_COMPLETED_GROUP_ID = 153; + public static final int CLUE_SCROLL_REWARD_GROUP_ID = 73; + public static final int BARROWS_REWARD_GROUP_ID = 155; + public static final int RAIDS_GROUP_ID = 513; + public static final int TOB_GROUP_ID = 28; + public static final int MOTHERLODE_MINE_GROUP_ID = 382; + public static final int EXPERIENCE_DROP_GROUP_ID = 122; + public static final int PUZZLE_BOX_GROUP_ID = 306; + public static final int LIGHT_BOX_GROUP_ID = 322; + public static final int NIGHTMARE_ZONE_GROUP_ID = 202; + public static final int NIGHTMARE_PILLAR_HEALTH_GROUP_ID = 413; + public static final int BLAST_FURNACE_GROUP_ID = 474; + public static final int WORLD_MAP_GROUP_ID = 595; + public static final int PYRAMID_PLUNDER_GROUP_ID = 428; + public static final int CHAMBERS_OF_XERIC_REWARD_GROUP_ID = 539; + public static final int THEATRE_OF_BLOOD_REWARD_GROUP_ID = 23; + public static final int EXPERIENCE_TRACKER_GROUP_ID = 122; + public static final int TITHE_FARM_GROUP_ID = 241; + public static final int KINGDOM_GROUP_ID = 616; + public static final int BARROWS_GROUP_ID = 24; + public static final int BLAST_MINE_GROUP_ID = 598; + public static final int MTA_ALCHEMY_GROUP_ID = 194; + public static final int MTA_ENCHANTMENT_GROUP_ID = 195; + public static final int MTA_GRAVEYARD_GROUP_ID = 196; + public static final int MTA_TELEKINETIC_GROUP_ID = 198; + public static final int CORP_DAMAGE = 13; + public static final int DESTROY_ITEM_GROUP_ID = 584; + public static final int VARROCK_MUSEUM_QUIZ_GROUP_ID = 533; + public static final int KILL_LOGS_GROUP_ID = 549; + public static final int DIARY_QUEST_GROUP_ID = 119; + public static final int THEATRE_OF_BLOOD_GROUP_ID = 23; + public static final int WORLD_SWITCHER_GROUP_ID = 69; + public static final int DIALOG_OPTION_GROUP_ID = 219; + public static final int DIALOG_PLAYER_GROUP_ID = 217; + public static final int DRIFT_NET_FISHING_REWARD_GROUP_ID = 607; + public static final int FOSSIL_ISLAND_OXYGENBAR_ID = 609; + public static final int MINIGAME_TAB_ID = 76; + public static final int SPELLBOOK_GROUP_ID = 218; + public static final int PVP_GROUP_ID = 90; + public static final int FISHING_TRAWLER_GROUP_ID = 366; + public static final int FISHING_TRAWLER_REWARD_GROUP_ID = 367; + public static final int ZEAH_MESS_HALL_GROUP_ID = 235; + public static final int KOUREND_FAVOUR_GROUP_ID = 246; + public static final int LOOTING_BAG_GROUP_ID = 81; + public static final int SKOTIZO_GROUP_ID = 308; + public static final int ENTERING_HOUSE_GROUP_ID = 71; + public static final int FULLSCREEN_CONTAINER_TLI = 165; + public static final int QUESTLIST_GROUP_ID = 399; + public static final int SKILLS_GROUP_ID = 320; + public static final int MUSIC_GROUP_ID = 239; + public static final int BARROWS_PUZZLE_GROUP_ID = 25; + public static final int KEPT_ON_DEATH_GROUP_ID = 4; + public static final int GUIDE_PRICE_GROUP_ID = 464; + public static final int SEED_VAULT_INVENTORY_GROUP_ID = 630; + public static final int BEGINNER_CLUE_MAP_CHAMPIONS_GUILD = 346; + public static final int BEGINNER_CLUE_MAP_VARROCK_EAST_MINE = 347; + public static final int BEGINNER_CLUE_MAP_DRAYNOR = 348; + public static final int BEGINNER_CLUE_MAP_NORTH_OF_FALADOR = 351; + public static final int BEGINNER_CLUE_MAP_WIZARDS_TOWER = 356; + public static final int SEED_BOX_GROUP_ID = 128; + public static final int SEED_VAULT_GROUP_ID = 631; + public static final int EXPLORERS_RING_ALCH_GROUP_ID = 483; + public static final int SETTINGS_SIDE_GROUP_ID = 116; + public static final int SETTINGS_GROUP_ID = 134; + public static final int GWD_KC_GROUP_ID = 406; + public static final int LMS_GROUP_ID = 333; + public static final int LMS_INGAME_GROUP_ID = 328; + public static final int ADVENTURE_LOG_ID = 187; + public static final int COLLECTION_LOG_ID = 621; + public static final int GENERIC_SCROLL_GROUP_ID = 625; + public static final int GAUNTLET_TIMER_GROUP_ID = 637; + public static final int HALLOWED_SEPULCHRE_TIMER_GROUP_ID = 668; + public static final int BANK_PIN_GROUP_ID = 213; + public static final int HEALTH_OVERLAY_BAR_GROUP_ID = 303; + public static final int CHAMBERS_OF_XERIC_STORAGE_UNIT_PRIVATE_GROUP_ID = 271; + public static final int CHAMBERS_OF_XERIC_STORAGE_UNIT_SHARED_GROUP_ID = 550; + public static final int CHAMBERS_OF_XERIC_STORAGE_UNIT_INVENTORY_GROUP_ID = 551; + public static final int DUEL_INVENTORY_GROUP_ID = 421; + public static final int DUEL_INVENTORY_OTHER_GROUP_ID = 481; + public static final int TRAILBLAZER_AREAS_GROUP_ID = 512; + public static final int TEMPOROSS_GROUP_ID = 437; + public static final int CLAN_GROUP_ID = 701; + public static final int CLAN_GUEST_GROUP_ID = 702; + public static final int GRAVESTONE_GROUP_ID = 672; + public static final int POH_TREASURE_CHEST_INVENTORY_GROUP_ID = 674; + public static final int GROUP_IRON_GROUP_ID = 726; + public static final int GROUP_STORAGE_INVENTORY_GROUP_ID = 725; + public static final int GROUP_STORAGE_GROUP_ID = 724; + public static final int WILDERNESS_LOOT_CHEST = 742; + public static final int TRADE_WINDOW_GROUP_ID = 335; + public static final int TOA_REWARD_GROUP_ID = 771; + /** + * toa party interface in the raid lobby + */ + public static final int TOA_PARTY_GROUP_ID = 773; + /** + * toa raid interface in the raid + */ + public static final int TOA_RAID_GROUP_ID = 481; + + public static final int DIALOG_MINIGAME_GROUP_ID = 229; + public static final int PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID = 243; + public static final int GAUNTLET_MAP_GROUP_ID = 638; + public static final int PLAYER_TRADE_CONFIRM_GROUP_ID = 334; + public static final int OPTIONS_GROUP_ID = 261; + public static final int JEWELLERY_BOX_GROUP_ID = 590; + public static final int EQUIPMENT_PAGE_GROUP_ID = 84; + public static final int QUESTTAB_GROUP_ID = 629; + public static final int MUSICTAB_GROUP_ID = 239; + public static final int FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID = 608; + public static final int THEATRE_OF_BLOOD_PARTY_GROUP_ID = 28; + public static final int DIALOG_NOTIFICATION_GROUP_ID = 229; + public static final int DIALOG_SPRITE2_ID = 11; + public static final int MULTISKILL_MENU_GROUP_ID = 270; + + + static class WorldMap + { + static final int MAPVIEW = 7; + static final int OVERVIEW_MAP = 10; + static final int BOTTOM_BAR = 23; + static final int SEARCH = 26; + static final int SURFACE_SELECTOR = 34; + static final int TOOLTIP = 41; + } + + static class SlayerRewards + { + static final int TOP_BAR = 12; + } + + static class DialogOption + { + static final int OPTIONS = 1; + } + + static class DialogNPC + { + static final int HEAD_MODEL = 2; + static final int NAME = 4; + static final int TEXT = 6; + } + + static class DialogPlayer + { + static final int TEXT = 6; + } + + static class LogoutPanel + { + static final int WORLD_SWITCHER_BUTTON = 3; + static final int LOGOUT_BUTTON = 6; + } + + static class PestControl + { + static final int KNIGHT_INFO_CONTAINER = 2; + + static final int ACTIVITY_SHIELD_CONTAINER = 9; + static final int ACTIVITY_BAR = 10; + static final int ACTIVITY_PROGRESS = 12; + + static final int PURPLE_SHIELD = 13; + static final int BLUE_SHIELD = 14; + static final int YELLOW_SHIELD = 15; + static final int RED_SHIELD = 16; + + static final int PURPLE_ICON = 17; + static final int BLUE_ICON = 18; + static final int YELLOW_ICON = 19; + static final int RED_ICON = 20; + + static final int PURPLE_HEALTH = 21; + static final int BLUE_HEALTH = 22; + static final int YELLOW_HEALTH = 23; + static final int RED_HEALTH = 24; + } + + static class FriendList + { + static final int TITLE = 3; + static final int FULL_CONTAINER = 5; + static final int SORT_BY_NAME_BUTTON = 7; + static final int SORT_BY_LAST_WORLD_CHANGE_BUTTON = 8; + static final int SORT_BY_WORLD_BUTTON = 9; + static final int LEGACY_SORT_BUTTON = 10; + static final int NAMES_CONTAINER = 11; + static final int SCROLL_BAR = 12; + static final int LOADING_TEXT = 13; + static final int PREVIOUS_NAME_HOLDER = 18; + } + + static class IgnoreList + { + static final int TITLE = 3; + static final int FULL_CONTAINER = 5; + static final int SORT_BY_NAME_BUTTON = 7; + static final int LEGACY_SORT_BUTTON = 8; + static final int NAMES_CONTAINER = 9; + static final int SCROLL_BAR = 10; + static final int LOADING_TEXT = 11; + static final int PREVIOUS_NAME_HOLDER = 16; + } + + static class FriendsChat + { + static final int ROOT = 0; + static final int TITLE = 1; + static final int OWNER = 2; + static final int LIST = 12; + } + + static class Bank + { + static final int BANK_CONTAINER = 1; + static final int INVENTORY_ITEM_CONTAINER = 3; + static final int BANK_TITLE_BAR = 3; + static final int TUTORIAL_BUTTON = 4; + static final int ITEM_COUNT_TOP = 5; + static final int ITEM_COUNT_BAR = 6; + static final int ITEM_COUNT_BOTTOM = 7; + static final int GROUP_STORAGE_BUTTON = 8; + static final int CONTENT_CONTAINER = 10; + static final int TAB_CONTAINER = 11; + static final int ITEM_CONTAINER = 13; + static final int SCROLLBAR = 14; + static final int SEARCH_BUTTON_BACKGROUND = 40; + static final int DEPOSIT_INVENTORY = 42; + static final int DEPOSIT_EQUIPMENT = 44; + static final int INCINERATOR = 46; + static final int INCINERATOR_CONFIRM = 47; + static final int EQUIPMENT_CONTENT_CONTAINER = 69; + static final int SETTINGS_BUTTON = 112; + static final int EQUIPMENT_BUTTON = 113; + } + + static class GroupStorage + { + static final int UI = 2; + static final int ITEM_CONTAINER = 10; + } + + static class GrandExchange + { + static final int WINDOW_CONTAINER = 0; + static final int WINDOW_BORDERS = 2; + static final int HISTORY_BUTTON = 3; + static final int BACK_BUTTON = 4; + static final int OFFER1 = 7; + static final int OFFER2 = 8; + static final int OFFER3 = 9; + static final int OFFER4 = 10; + static final int OFFER5 = 11; + static final int OFFER6 = 12; + static final int OFFER7 = 13; + static final int OFFER8 = 14; + static final int OFFER_CONTAINER = 25; + static final int OFFER_DESCRIPTION = 26; + static final int OFFER_PRICE = 27; + static final int OFFER_CONFIRM_BUTTON = 29; + } + + static class GrandExchangeInventory + { + static final int INVENTORY_ITEM_CONTAINER = 0; + } + + static class DepositBox + { + static final int INVENTORY_ITEM_CONTAINER = 2; + } + + static class Shop + { + static final int INVENTORY_ITEM_CONTAINER = 0; + } + + static class Smithing + { + static final int INVENTORY_ITEM_CONTAINER = 0; + + static final int QTY_1 = 3; + static final int QTY_5 = 4; + static final int QTY_10 = 5; + static final int QTY_X = 6; + static final int QTY_ALL = 7; + + static final int DAGGER = 9; + static final int SWORD = 10; + static final int SCIMITAR = 11; + static final int LONG_SWORD = 12; + static final int TWO_H_SWORD = 13; + static final int AXE = 14; + static final int MACE = 15; + static final int WARHAMMER = 16; + static final int BATTLE_AXE = 17; + static final int CLAWS = 18; + static final int CHAIN_BODY = 19; + static final int PLATE_LEGS = 20; + static final int PLATE_SKIRT = 21; + static final int PLATE_BODY = 22; + static final int NAILS = 23; + static final int MED_HELM = 24; + static final int FULL_HELM = 25; + static final int SQ_SHIELD = 26; + static final int KITE_SHIELD = 27; + static final int EXCLUSIVE1 = 28; + static final int DART_TIPS = 29; + static final int ARROW_HEADS = 30; + static final int KNIVES = 31; + static final int EXCLUSIVE2 = 32; + static final int JAVELIN_HEADS = 33; + static final int BOLTS = 34; + static final int LIMBS = 35; + } + + static class GuidePrices + { + static final int ITEM_CONTAINER = 2; + static final int INVENTORY_ITEM_CONTAINER = 0; + } + + static class Emotes + { + static final int EMOTE_WINDOW = 0; + static final int EMOTE_SCROLL_CONTAINER = 1; + static final int EMOTE_CONTAINER = 2; + static final int EMOTE_SCROLLBAR = 4; + } + + static class Cluescroll + { + static final int CLUE_TEXT = 2; + static final int CLUE_SCROLL_ITEM_CONTAINER = 3; + } + + static class Minimap + { + static final int XP_ORB = 5; + static final int HEALTH_ORB = 6; + static final int PRAYER_ORB = 17; + static final int QUICK_PRAYER_ORB = 19; // Has the "Quick-prayers" name + static final int PRAYER_ORB_TEXT = 20; + static final int RUN_ORB = 25; + static final int TOGGLE_RUN_ORB = 27; // Has the "Toggle run" name + static final int RUN_ORB_TEXT = 28; + static final int SPEC_CLICKBOX = 31; + static final int SPEC_ORB = 33; + static final int WORLDMAP_ORB = 48; + static final int WIKI_BANNER_PARENT = 49; + static final int WIKI_BANNER = 50; + static final int WORLDMAP_OPTIONS = 53; + } + + static class LoginClickToPlayScreen + { + static final int MESSAGE_OF_THE_DAY = 7; + } + + static class FixedViewport + { + static final int MINIMAP = 8; + static final int MINIMAP_DRAW_AREA = 21; + static final int FIXED_VIEWPORT = 32; + static final int MULTICOMBAT_INDICATOR = 36; + static final int FRIENDS_CHAT_TAB = 46; + static final int FRIENDS_TAB = 48; + static final int IGNORES_TAB = 47; + static final int LOGOUT_TAB = 49; + static final int OPTIONS_TAB = 50; + static final int EMOTES_TAB = 51; + static final int MUSIC_TAB = 52; + static final int FRIENDS_CHAT_ICON = 53; + static final int FRIENDS_ICON = 55; + static final int IGNORES_ICON = 54; + static final int LOGOUT_ICON = 56; + static final int OPTIONS_ICON = 57; + static final int EMOTES_ICON = 58; + static final int MUSIC_ICON = 59; + static final int COMBAT_TAB = 62; + static final int STATS_TAB = 63; + static final int QUESTS_TAB = 64; + static final int INVENTORY_TAB = 65; + static final int EQUIPMENT_TAB = 66; + static final int PRAYER_TAB = 67; + static final int MAGIC_TAB = 68; + static final int COMBAT_ICON = 69; + static final int STATS_ICON = 70; + static final int QUESTS_ICON = 71; + static final int INVENTORY_ICON = 72; + static final int EQUIPMENT_ICON = 73; + static final int PRAYER_ICON = 74; + static final int MAGIC_ICON = 75; + static final int ROOT_INTERFACE_CONTAINER = 16; + static final int BANK_CONTAINER = 77; + static final int INTERFACE_CONTAINER = 78; + static final int INVENTORY_CONTAINER = 82; + } + + static class ResizableViewport + { + static final int RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX = 15; + static final int MULTICOMBAT_INDICATOR = 19; + static final int MINIMAP = 93; + static final int MINIMAP_DRAW_AREA = 29; + static final int MINIMAP_ORB_HOLDER = 32; + static final int FRIENDS_CHAT_TAB = 42; + static final int IGNORES_TAB = 43; + static final int FRIENDS_TAB = 44; + static final int LOGOUT_TAB = 45; + static final int OPTIONS_TAB = 46; + static final int EMOTES_TAB = 47; + static final int MUSIC_TAB = 48; + static final int FRIENDS_CHAT_ICON = 49; + static final int FRIENDS_ICON = 51; + static final int IGNORES_ICON = 50; + static final int LOGOUT_ICON = 52; + static final int OPTIONS_ICON = 53; + static final int EMOTES_ICON = 54; + static final int MUSIC_ICON = 55; + static final int COMBAT_TAB = 58; + static final int STATS_TAB = 59; + static final int QUESTS_TAB = 60; + static final int INVENTORY_TAB = 61; + static final int EQUIPMENT_TAB = 62; + static final int PRAYER_TAB = 63; + static final int MAGIC_TAB = 64; + static final int COMBAT_ICON = 65; + static final int STATS_ICON = 66; + static final int QUESTS_ICON = 67; + static final int INVENTORY_ICON = 68; + static final int EQUIPMENT_ICON = 69; + static final int PRAYER_ICON = 70; + static final int MAGIC_ICON = 71; + static final int INTERFACE_CONTAINER = 72; + static final int INVENTORY_CONTAINER = 78; + static final int CHATBOX_PARENT = 94; + static final int INVENTORY_PARENT = 95; + } + + static class ResizableViewportBottomLine + { + static final int RESIZABLE_VIEWPORT_BOTTOM_LINE = 15; + static final int MINIMAP = 90; + static final int MINIMAP_DRAW_AREA = 29; + static final int MINIMAP_ORB_HOLDER = 32; + static final int LOGOUT_BUTTON_OVERLAY = 33; + static final int MINIMAP_LOGOUT_BUTTON = 34; + static final int FC_ICON = 43; + static final int FRIEND_ICON = 45; + static final int SETTINGS_ICON = 46; + static final int EMOTE_ICON = 47; + static final int MUSIC_ICON = 48; + static final int INVENTORY_TAB = 54; + static final int PRAYER_TAB = 56; + static final int MAGIC_TAB = 57; + static final int CMB_ICON = 58; + static final int SKILLS_ICON = 59; + static final int QUESTS_ICON = 60; + static final int INVENTORY_ICON = 61; + static final int EQUIP_ICON = 62; + static final int PRAYER_ICON = 63; + static final int MAGIC_ICON = 64; + static final int INTERFACE_CONTAINER = 69; + static final int INVENTORY_CONTAINER = 75; + static final int CHATBOX_PARENT = 91; + static final int TABS1 = 92; + static final int TABS2 = 93; + static final int INVENTORY_PARENT = 94; + } + + static class Chatbox + { + static final int PARENT = 0; + static final int BUTTONS = 1; + static final int TAB_ALL = 4; + static final int TAB_GAME = 7; + static final int TAB_PUBLIC = 11; + static final int TAB_PRIVATE = 15; + static final int TAB_CHANNEL = 19; + static final int TAB_CLAN = 23; + static final int TAB_TRADE = 27; + static final int REPORT_TEXT = 33; + static final int FRAME = 34; + static final int TRANSPARENT_BACKGROUND = 35; + static final int CONTAINER = 37; + static final int TITLE = 41; + static final int FULL_INPUT = 42; + static final int GE_SEARCH_RESULTS = 50; + static final int MESSAGES = 53; + static final int TRANSPARENT_BACKGROUND_LINES = 54; + static final int INPUT = 55; + static final int MESSAGE_LINES = 56; + static final int FIRST_MESSAGE = 57; + } + + static class Prayer + { + static final int THICK_SKIN = 9; + static final int BURST_OF_STRENGTH = 10; + static final int CLARITY_OF_THOUGHT = 11; + static final int ROCK_SKIN = 12; + static final int SUPERHUMAN_STRENGTH = 13; + static final int IMPROVED_REFLEXES = 14; + static final int RAPID_RESTORE = 15; + static final int RAPID_HEAL = 16; + static final int PROTECT_ITEM = 17; + static final int STEEL_SKIN = 18; + static final int ULTIMATE_STRENGTH = 19; + static final int INCREDIBLE_REFLEXES = 20; + static final int PROTECT_FROM_MAGIC = 21; + static final int PROTECT_FROM_MISSILES = 22; + static final int PROTECT_FROM_MELEE = 23; + static final int RETRIBUTION = 24; + static final int REDEMPTION = 25; + static final int SMITE = 26; + static final int SHARP_EYE = 27; + static final int HAWK_EYE = 28; + static final int EAGLE_EYE = 29; + static final int MYSTIC_WILL = 30; + static final int MYSTIC_LORE = 31; + static final int MYSTIC_MIGHT = 32; + static final int RIGOUR = 33; + static final int CHIVALRY = 34; + static final int PIETY = 35; + static final int AUGURY = 36; + static final int PRESERVE = 37; + } + public static class QuickPrayer + { + static final int PRAYERS = 4; + + public static final int THICK_SKIN_CHILD_ID = 0; + public static final int BURST_OF_STRENGTH_CHILD_ID = 1; + public static final int CLARITY_OF_THOUGHT_CHILD_ID = 2; + public static final int SHARP_EYE_CHILD_ID = 18; + public static final int MYSTIC_WILL_CHILD_ID = 19; + public static final int ROCK_SKIN_CHILD_ID = 3; + public static final int SUPERHUMAN_STRENGTH_CHILD_ID = 4; + public static final int IMPROVED_REFLEXES_CHILD_ID = 5; + public static final int RAPID_RESTORE_CHILD_ID = 6; + public static final int RAPID_HEAL_CHILD_ID = 7; + public static final int PROTECT_ITEM_CHILD_ID = 8; + public static final int HAWK_EYE_CHILD_ID = 20; + public static final int MYSTIC_LORE_CHILD_ID = 21; + public static final int STEEL_SKIN_CHILD_ID = 9; + public static final int ULTIMATE_STRENGTH_CHILD_ID = 10; + public static final int INCREDIBLE_REFLEXES_CHILD_ID = 11; + public static final int PROTECT_FROM_MAGIC_CHILD_ID = 12; + public static final int PROTECT_FROM_MISSILES_CHILD_ID = 13; + public static final int PROTECT_FROM_MELEE_CHILD_ID = 14; + public static final int EAGLE_EYE_CHILD_ID = 22; + public static final int MYSTIC_MIGHT_CHILD_ID = 23; + public static final int RETRIBUTION_CHILD_ID = 15; + public static final int REDEMPTION_CHILD_ID = 16; + public static final int SMITE_CHILD_ID = 17; + public static final int PRESERVE_CHILD_ID = 28; + public static final int CHIVALRY_CHILD_ID = 25; + public static final int PIETY_CHILD_ID = 26; + public static final int RIGOUR_CHILD_ID = 24; + public static final int AUGURY_CHILD_ID = 27; + } + + static class Combat + { + static final int WEAPON_NAME = 1; + static final int LEVEL = 3; + static final int STYLE_ONE = 4; + static final int STYLE_TWO = 8; + static final int STYLE_THREE = 12; + static final int STYLE_FOUR = 16; + static final int SPELLS = 20; + static final int DEFENSIVE_SPELL_BOX = 21; + static final int DEFENSIVE_SPELL_ICON = 23; + static final int DEFENSIVE_SPELL_SHIELD = 24; + static final int DEFENSIVE_SPELL_TEXT = 25; + static final int SPELL_BOX = 26; + static final int SPELL_ICON = 28; + static final int SPELL_TEXT = 29; + static final int AUTO_RETALIATE = 30; + static final int SPECIAL_ATTACK_BAR = 34; + static final int SPECIAL_ATTACK_CLICKBOX = 41; + static final int TOOLTIP = 41; + } + + static class VolcanicMine + { + static final int STABILITY_INFOBOX_CONTAINER = 2; + static final int TIME_LEFT = 6; + static final int POINTS = 8; + static final int STABILITY = 10; + static final int PLAYER_COUNT = 12; + static final int VENT_A_PERCENTAGE = 16; + static final int VENT_B_PERCENTAGE = 17; + static final int VENT_C_PERCENTAGE = 18; + static final int VENT_A_STATUS = 20; + static final int VENT_B_STATUS = 21; + static final int VENT_C_STATUS = 22; + static final int VENTS_INFOBOX_CONTAINER = 26; + } + + static class BarbarianAssault + { + static class ATK + { + static final int ROLE_SPRITE = 11; + static final int ROLE = 12; + } + + static class HLR + { + static final int TEAMMATES = 13; + static final int TEAMMATE1 = 18; + static final int TEAMMATE2 = 22; + static final int TEAMMATE3 = 26; + static final int TEAMMATE4 = 30; + } + + static final int TEAM = 2; + + static final int ROLE_SPRITE = 10; + static final int ROLE = 11; + + static final int REWARD_TEXT = 57; + } + + static class LevelUp + { + static final int SKILL = 1; + static final int LEVEL = 2; + static final int CONTINUE = 3; + } + + static class QuestCompleted + { + static final int NAME_TEXT = 4; + } + + static class Raids + { + static final int POINTS_INFOBOX = 3; + } + + static class Health + { + static final int HEALTHBAR_CONTAINER = 5; + static final int HEALTHBAR_TEXT = 20; + } + + static class ChambersOfXericStorageUnitPrivate + { + static final int PRIVATE_CHEST_ITEM_CONTAINER = 6; + } + + static class Tob + { + static final int PARTY_INTERFACE = 5; + static final int PARTY_STATS = 7; + static final int HEALTHBAR_CONTAINER = 9; + } + + static class PuzzleBox + { + static final int VISIBLE_BOX = 4; + } + + static class LightBox + { + static final int LIGHT_BOX = 1; + static final int LIGHT_BOX_WINDOW = 2; + static final int LIGHT_BULB_CONTAINER = 3; + static final int LIGHT_BOX_BUTTON_CONTAINER = 6; + static final int BUTTON_A = 8; + static final int BUTTON_B = 9; + static final int BUTTON_C = 10; + static final int BUTTON_D = 11; + static final int BUTTON_E = 12; + static final int BUTTON_F = 13; + static final int BUTTON_G = 14; + static final int BUTTON_H = 15; + } + + static class DialogSprite + { + static final int SPRITE = 1; + static final int TEXT = 2; + } + + static class ExperienceTracker + { + static final int WIDGET = 4; + static final int BOTTOM_BAR = 16; + } + + static class FairyRingPanel + { + static final int HEADER = 2; + static final int LIST = 7; + static final int FAVORITES = 8; + static final int SEPARATOR = 9; + static final int SCROLLBAR = 152; + } + + static class FairyRing + { + static final int LEFT_ORB_CLOCKWISE = 19; + static final int LEFT_ORB_COUNTER_CLOCKWISE = 20; + static final int MIDDLE_ORB_CLOCKWISE = 21; + static final int MIDDLE_ORB_COUNTER_CLOCKWISE = 22; + static final int RIGHT_ORB_CLOCKWISE = 23; + static final int RIGHT_ORB_COUNTER_CLOCKWISE = 24; + static final int TELEPORT_BUTTON = 26; + } + + static class FairyRingCode + { + static final int FAIRY_QUEEN_HIDEOUT = 139; + } + + static class Barrows + { + static final int BARROWS_BROTHERS = 4; + static final int BARROWS_POTENTIAL = 5; + } + + static class Diary + { + static final int DIARY_TITLE = 2; + static final int DIARY_TEXT = 3; + } + + static class DestroyItem + { + static final int DESTROY_ITEM_NAME = 6; + static final int DESTROY_ITEM_YES = 1; + static final int DESTROY_ITEM_NO = 3; + } + + static class VarrockMuseum + { + static final int VARROCK_MUSEUM_QUESTION = 28; + static final int VARROCK_MUSEUM_FIRST_ANSWER = 29; + static final int VARROCK_MUSEUM_SECOND_ANSWER = 30; + static final int VARROCK_MUSEUM_THIRD_ANSWER = 31; + } + + static class KillLog + { + static final int TITLE = 3; + static final int MONSTER = 13; + static final int KILLS = 14; + static final int STREAK = 15; + } + + static class WorldSwitcher + { + static final int CONTAINER = 1; + static final int WORLD_LIST = 16; + static final int LOGOUT_BUTTON = 23; + } + + static class Minigames + { + static final int TELEPORT_BUTTON = 30; + } + + static class StandardSpellBook + { + static final int LUMBRIDGE_HOME_TELEPORT = 7; + static final int KOUREND_HOME_TELEPORT = 4; + static final int CATHERBY_HOME_TELEPORT = 5; + } + + static class AncientSpellBook + { + static final int EDGEVILLE_HOME_TELEPORT = 100; + } + + static class LunarSpellBook + { + static final int LUNAR_HOME_TELEPORT = 101; + static final int FERTILE_SOIL = 126; + } + + static class ArceuusSpellBook + { + static final int ARCEUUS_HOME_TELEPORT = 145; + } + + static class Pvp + { + static final int KILLDEATH_RATIO = 26; + static final int WILDERNESS_SKULL_CONTAINER = 44; + static final int SKULL_CONTAINER = 45; + static final int SAFE_ZONE = 47; + static final int WILDERNESS_LEVEL = 50; // this can also be the Deadman mode "Protection" text + } + + static class KourendFavour + { + static final int KOUREND_FAVOUR_OVERLAY = 1; + } + + static class Zeah + { + static final int MESS_HALL_COOKING_DISPLAY = 2; + } + + static class LootingBag + { + static final int LOOTING_BAG_INVENTORY = 5; + } + + static class Skotizo + { + static final int CONTAINER = 2; + } + + static class QuestList + { + static final int BOX = 0; + static final int CONTAINER = 2; + } + + static class Music + { + static final int CONTAINER = 0; + static final int SCROLL_CONTAINER = 3; + static final int LIST = 5; + static final int SCROLLBAR = 6; + } + + static class Barrows_Puzzle + { + static final int PARENT = 0; + static final int SEQUENCE_1 = 3; + static final int ANSWER1_CONTAINER = 12; + static final int ANSWER1 = 13; + static final int ANSWER2_CONTAINER = 14; + static final int ANSWER2 = 15; + static final int ANSWER3_CONTAINER = 16; + static final int ANSWER3 = 17; + } + + static class SeedVault + { + static final int INVENTORY_ITEM_CONTAINER = 1; + static final int TITLE_CONTAINER = 2; + static final int ITEM_CONTAINER = 15; + static final int ITEM_TEXT = 16; + } + + static class ExplorersRing + { + static final int INVENTORY = 7; + } + + static class SettingsSide + { + static final int CAMERA_ZOOM_SLIDER_TRACK = 100; + static final int MUSIC_SLIDER = 29; + static final int SOUND_EFFECT_SLIDER = 43; + static final int AREA_SOUND_SLIDER = 57; + } + + static class Settings + { + static final int INIT = 1; + } + + static class AchievementDiary + { + static final int CONTAINER = 2; + } + + static class Skills + { + static final int CONTAINER = 0; + } + + static class Lms + { + static final int INFO = 2; + } + + static class LmsKDA + { + static final int INFO = 4; + } + + static class AdventureLog + { + static final int CONTAINER = 0; + } + + static class CollectionLog + { + static final int CONTAINER = 0; + static final int TABS = 3; + static final int ENTRY = 17; + static final int ENTRY_HEADER = 19; + static final int ENTRY_ITEMS = 36; + } + + static class GenericScroll + { + static final int TEXT = 7; + } + + static class GauntletTimer + { + static final int CONTAINER = 2; + } + + static class HallowedSepulchreTimer + { + static final int CONTAINER = 2; + } + + static class TrailblazerAreas + { + static final int TELEPORT = 59; + } + + static class TemporossStatus + { + static final int STATUS_INDICATOR = 2; + } + + static class Clan + { + static final int LAYER = 0; + static final int HEADER = 1; + static final int MEMBERS = 6; + } + + static class ClanGuest + { + static final int LAYER = 0; + static final int HEADER = 1; + static final int MEMBERS = 6; + } + + static class Trade + { + static final int HEADER = 31; + } + + static class Equipment + { + static final int HELMET = 15; + static final int CAPE = 16; + static final int AMULET = 17; + static final int WEAPON = 18; + static final int BODY = 19; + static final int SHIELD = 20; + static final int LEGS = 21; + static final int GLOVES = 22; + static final int BOOTS = 23; + static final int RING = 24; + static final int AMMO = 25; + + static final int INVENTORY_ITEM_CONTAINER = 0; + } + + static class BankPin + { + static final int CONTAINER = 0; + static final int TOP_LEFT_TEXT = 2; + static final int FIRST_ENTERED = 3; + static final int SECOND_ENTERED = 4; + static final int THIRD_ENTERED = 5; + static final int FOURTH_ENTERED = 6; + static final int INSTRUCTION_TEXT = 10; + static final int EXIT_BUTTON = 13; + static final int FORGOT_BUTTON = 15; + static final int BUTTON_1 = 16; + static final int BUTTON_2 = 18; + static final int BUTTON_3 = 20; + static final int BUTTON_4 = 22; + static final int BUTTON_5 = 24; + static final int BUTTON_6 = 26; + static final int BUTTON_7 = 28; + static final int BUTTON_8 = 30; + static final int BUTTON_9 = 32; + static final int BUTTON_10 = 34; + } + + static class DialogNotification + { + static final int TEXT = 0; + static final int CONTINUE = 1; + } + + static class PestControlExchangeWindow + { + static final int ITEM_LIST = 2; + static final int BOTTOM = 5; + static final int POINTS = 8; + static final int CONFIRM_BUTTON = 6; + } + + static class MinigameDialog + { + static final int TEXT = 1; + static final int CONTINUE = 2; + } + + static class TheatreOfBlood + { + static final int RAIDING_PARTY = 9; + static final int ORB_BOX = 10; + static final int BOSS_HEALTH_BAR = 35; + } + + static class TheatreOfBloodParty + { + static final int CONTAINER = 10; + } + + static class EquipmentWidgetIdentifiers + { + static final int EQUIP_YOUR_CHARACTER = 3; + static final int STAB_ATTACK_BONUS = 24; + static final int SLASH_ATTACK_BONUS = 25; + static final int CRUSH_ATTACK_BONUS = 26; + static final int MAGIC_ATTACK_BONUS = 27; + static final int RANGED_ATTACK_BONUS = 28; + static final int STAB_DEFENCE_BONUS = 30; + static final int SLASH_DEFENCE_BONUS = 31; + static final int CRUSH_DEFENCE_BONUS = 32; + static final int MAGIC_DEFENCE_BONUS = 33; + static final int RANGED_DEFENCE_BONUS = 34; + static final int MELEE_STRENGTH = 36; + static final int RANGED_STRENGTH = 37; + static final int MAGIC_DAMAGE = 38; + static final int PRAYER_BONUS = 39; + static final int UNDEAD_DAMAGE_BONUS = 41; + static final int SLAYER_DAMAGE_BONUS = 42; + static final int WEIGHT = 49; + } + + static class FossilMushroomTeleport + { + static final int ROOT = 2; + static final int HOUSE_ON_HILL = 4; + static final int VERDANT_VALLEY = 8; + static final int SWAMP = 12; + static final int MUSHROOM_MEADOW = 16; + } + + static class SpellBook + { + static final int FILTERED_SPELLS_BOUNDS = 3; + static final int TOOLTIP = 190; + + // NORMAL SPELLS + static final int LUMBRIDGE_HOME_TELEPORT = 7; + static final int WIND_STRIKE = 8; + static final int CONFUSE = 9; + static final int ENCHANT_CROSSBOW_BOLT = 10; + static final int WATER_STRIKE = 11; + static final int EARTH_STRIKE = 14; + static final int WEAKEN = 15; + static final int FIRE_STRIKE = 16; + static final int BONES_TO_BANANAS = 17; + static final int WIND_BOLT = 18; + static final int CURSE = 19; + static final int BIND = 20; + static final int LOW_LEVEL_ALCHEMY = 21; + static final int WATER_BOLT = 22; + static final int VARROCK_TELEPORT = 23; + static final int EARTH_BOLT = 25; + static final int LUMBRIDGE_TELEPORT = 26; + static final int TELEKINETIC_GRAB = 27; + static final int FIRE_BOLT = 28; + static final int FALADOR_TELEPORT = 29; + static final int CRUMBLE_UNDEAD = 20; + static final int TELEPORT_TO_HOUSE = 31; + static final int WIND_BLAST = 32; + static final int SUPERHEAT_ITEM = 33; + static final int CAMELOT_TELEPORT = 34; + static final int WATER_BLAST = 35; + static final int TELEPORT_TO_KOUREND = 36; + static final int IBAN_BLAST = 38; + static final int SNARE = 39; + static final int MAGIC_DART = 40; + static final int ARDOUGNE_TELEPORT = 41; + static final int EARTH_BLAST = 42; + static final int CIVITAS_TELEPORT = 43; + static final int HIGH_LEVEL_ALCHEMY = 44; + static final int CHARGE_WATER_ORB = 45; + static final int WATCHTOWER_TELEPORT = 47; + static final int FIRE_BLAST = 48; + static final int CHARGE_EARTH_ORB = 49; + static final int BONES_TO_PEACHES = 50; + static final int SARADOMIN_STRIKE = 51; + static final int CLAWS_OF_GUTHIX = 52; + static final int FLAMES_OF_ZAMORAK = 53; + static final int TROLLHEIM_TELEPORT = 54; + static final int WIND_WAVE = 55; + static final int CHARGE_FIRE_ORB = 56; + static final int TELEPORT_TO_APE_ATOLL = 57; + static final int WATER_WAVE = 58; + static final int CHARGE_AIR_ORB = 59; + static final int VULNERABILITY = 60; + static final int EARTH_WAVE = 62; + static final int ENFEEBLE = 63; + static final int TELEOTHER_LUMBRIDGE = 64; + static final int FIRE_WAVE = 65; + static final int ENTANGLE = 66; + static final int STUN = 67; + static final int CHARGE = 68; + static final int WIND_SURGE = 69; + static final int TELEOTHER_FALADOR = 70; + static final int WATER_SURGE = 71; + static final int TELE_BLOCK = 72; + static final int BOUNTY_TARGET_TELEPORT = 73; + static final int TELEOTHER_CAMELOT = 75; + static final int EARTH_SURGE = 76; + static final int FIRE_SURGE = 78; + + + //ENCHANTING SPELLS + static final int BACK_TO_MAIN_SPELLBOOK = 4; + static final int LVL_1_ENCHANT = 13; + static final int LVL_2_ENCHANT = 24; + static final int LVL_3_ENCHANT = 37; + static final int LVL_4_ENCHANT = 46; + static final int LVL_5_ENCHANT = 61; + static final int LVL_6_ENCHANT = 74; + static final int LVL_7_ENCHANT = 77; + + // ANCIENT SPELLS + static final int ICE_RUSH = 79; + static final int ICE_BLITZ = 80; + static final int ICE_BURST = 81; + static final int ICE_BARRAGE = 82; + static final int BLOOD_RUSH = 83; + static final int BLOOD_BLITZ = 84; + static final int BLOOD_BURST = 85; + static final int BLOOD_BARRAGE = 86; + static final int SMOKE_RUSH = 87; + static final int SMOKE_BLITZ = 88; + static final int SMOKE_BURST = 89; + static final int SMOKE_BARRAGE = 90; + static final int SHADOW_RUSH = 91; + static final int SHADOW_BLITZ = 92; + static final int SHADOW_BURST = 93; + static final int SHADOW_BARRAGE = 94; + static final int PADDEWWA_TELEPORT = 95; + static final int SENNTISTEN_TELEPORT = 96; + static final int KHARYRLL_TELEPORT = 97; + static final int LASSAR_TELEPORT = 98; + static final int DAREEYAK_TELEPORT = 99; + static final int CARRALLANGER_TELEPORT = 100; + static final int ANNAKARL_TELEPORT = 101; + static final int GHORROCK_TELEPORT = 102; + static final int EDGEVILLE_HOME_TELEPORT = 103; + + // LUNAR SPELLS + static final int LUNAR_HOME_TELEPORT = 104; + static final int BAKE_PIE = 105; + static final int CURE_PLANT = 106; + static final int MONSTER_EXAMINE = 107; + static final int NPC_CONTACT = 108; + static final int CURE_OTHER = 109; + static final int HUMIDIFY = 110; + static final int MOONCLAN_TELEPORT = 111; + static final int TELE_GROUP_MOONCLAN = 112; + static final int CURE_ME = 113; + static final int HUNTER_KIT = 114; + static final int WATERBIRTH_TELEPORT = 115; + static final int TELE_GROUP_WATERBIRTH = 116; + static final int CURE_GROUP = 117; + static final int STAT_SPY = 118; + static final int BARBARIAN_TELEPORT = 119; + static final int TELE_GROUP_BARBARIAN = 120; + static final int SUPERGLASS_MAKE = 121; + static final int TAN_LEATHER = 122; + static final int KHAZARD_TELEPORT = 123; + static final int TELE_GROUP_KHAZARD = 124; + static final int DREAM = 125; + static final int STRING_JEWELLERY = 126; + static final int STAT_RESTORE_POT_SHARE = 127; + static final int MAGIC_IMBUE = 128; + static final int FERTILE_SOIL = 129; + static final int BOOST_POTION_SHARE = 130; + static final int FISHING_GUILD_TELEPORT = 131; + static final int TELE_GROUP_FISHING_GUILD = 132; + static final int PLANK_MAKE = 133; + static final int CATHERBY_TELEPORT = 134; + static final int TELE_GROUP_CATHERBY = 135; + static final int RECHARGE_DRAGONSTONE = 136; + static final int ICE_PLATEAU_TELEPORT = 137; + static final int TELE_GROUP_ICE_PLATEAU = 138; + static final int ENERGY_TRANSFER = 139; + static final int HEAL_OTHER = 140; + static final int VENGEANCE_OTHER = 141; + static final int VENGEANCE = 142; + static final int HEAL_GROUP = 143; + static final int SPELLBOOK_SWAP = 144; + static final int GEOMANCY = 145; + static final int SPIN_FLAX = 146; + static final int OURANIA_TELEPORT = 147; + + // ARCEUUS SPELLS + static final int ARCEUUS_HOME_TELEPORT = 148; + static final int BASIC_REANIMATION = 149; + static final int ARCEUUS_LIBRARY_TELEPORT = 150; + static final int ADEPT_REANIMATION = 151; + static final int EXPERT_REANIMATION = 152; + static final int MASTER_REANIMATION = 153; + static final int DRAYNOR_MANOR_TELEPORT = 154; + static final int MIND_ALTAR_TELEPORT = 156; + static final int RESPAWN_TELEPORT = 157; + static final int SALVE_GRAVEYARD_TELEPORT = 158; + static final int FENKENSTRAINS_CASTLE_TELEPORT = 159; + static final int WEST_ARDOUGNE_TELEPORT = 160; + static final int HARMONY_ISLAND_TELEPORT = 161; + static final int CEMETERY_TELEPORT = 162; + static final int RESURRECT_CROPS = 163; + static final int BARROWS_TELEPORT = 164; + static final int APE_ATOLL_TELEPORT = 165; + static final int BATTLEFRONT_TELEPORT = 166; + static final int INFERIOR_DEMONBANE = 167; + static final int SUPERIOR_DEMONBANE = 168; + static final int DARK_DEMONBANE = 169; + static final int MARK_OF_DARKNESS = 170; + static final int GHOSTLY_GRASP = 171; + static final int SKELETAL_GRASP = 172; + static final int UNDEAD_GRASP = 173; + static final int WARD_OF_ARCEUUS = 174; + static final int LESSER_CORRUPTION = 175; + static final int GREATER_CORRUPTION = 176; + static final int DEMONIC_OFFERING = 177; + static final int SINISTER_OFFERING = 178; + static final int DEGRIME = 179; + static final int SHADOW_VEIL = 180; + static final int VILE_VIGOUR = 181; + static final int DARK_LURE = 182; + static final int DEATH_CHARGE = 183; + static final int RESURRECT_LESSER_GHOST = 184; + static final int RESURRECT_LESSER_SKELETON = 185; + static final int RESURRECT_LESSER_ZOMBIE = 186; + static final int RESURRECT_SUPERIOR_GHOST = 187; + static final int RESURRECT_SUPERIOR_SKELETON = 188; + static final int RESURRECT_SUPERIOR_ZOMBIE = 189; + static final int RESURRECT_GREATER_GHOST = 190; + static final int RESURRECT_GREATER_SKELETON = 191; + static final int RESURRECT_GREATER_ZOMBIE = 192; + } + + static class DialogSprite2 + { + static final int SPRITE1 = 1; + static final int TEXT = 2; + static final int SPRITE2 = 3; + static final int CONTINUE = 4; + } + + static class QuestTab + { + static final int QUEST_TAB = 3; + } + + public static class TradeScreen + { + public static final int FIRST_TRADING_WITH = 31; + public static final int SECOND_ACCEPT_FUNC = 13; + public static final int SECOND_DECLINE_FUNC = 14; + public static final int SECOND_MY_OFFER = 23; + public static final int SECOND_THEIR_OFFER = 24; + public static final int SECOND_ACCEPT_TEXT = 25; + public static final int SECOND_DECLINE_TEXT = 26; + public static final int SECOND_MY_ITEMS = 28; + public static final int SECOND_THEIR_ITEMS = 29; + public static final int SECOND_TRADING_WITH = 30; + } + + public static class DuelConfig + { + public static final int CONFIG_GROUP_IP = 482; + public static final int TITLE = 35; + public static final int OPPONENT_ATT = 9; + public static final int OPPONENT_STR = 13; + public static final int OPPONENT_DEF = 17; + public static final int OPPONENT_HP = 21; + } + + public static class DuelResult + { + public static final int RESULT_GROUP_ID = 372; + public static final int TITLE = 16; + public static final int TOTAL_STAKED = 32; + public static final int TOTAL_TAX = 39; + public static final int WINNINGS = 40; + } + + static class JewelBox + { + static final int DUEL_RING = 2; + static final int GAME_NECK = 3; + static final int COMB_BRAC = 4; + static final int SKIL_NECK = 5; + static final int RING_OFGP = 6; + static final int AMUL_GLOR = 7; // yes + } + + static class Options + { + static final int CAMERA_ZOOM_SLIDER_HANDLE = 15; + static final int MUSIC_SLIDER = 37; + static final int SOUND_EFFECT_SLIDER = 43; + static final int AREA_SOUND_SLIDER = 49; + } + + static class GauntletMap + { + static final int CONTAINER = 4; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetInfoExtended.java b/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetInfoExtended.java new file mode 100644 index 0000000..c573e93 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/nono/packets/utils/WidgetInfoExtended.java @@ -0,0 +1,1007 @@ +/* + * Copyright (c) 2017, Adam + * 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 ee.futur.baseapi.nono.packets.utils; + +import net.runelite.api.widgets.Widget; + +/** + * Represents a group-child {@link Widget} relationship. + *

+ */ +public enum WidgetInfoExtended { + FAIRY_RING_LEFT_ORB_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.LEFT_ORB_CLOCKWISE), + FAIRY_RING_LEFT_ORB_COUNTER_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.LEFT_ORB_COUNTER_CLOCKWISE), + FAIRY_RING_MIDDLE_ORB_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.MIDDLE_ORB_CLOCKWISE), + FAIRY_RING_MIDDLE_ORB_COUNTER_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.MIDDLE_ORB_COUNTER_CLOCKWISE), + FAIRY_RING_RIGHT_ORB_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.RIGHT_ORB_CLOCKWISE), + FAIRY_RING_RIGHT_ORB_COUNTER_CLOCKWISE(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.RIGHT_ORB_COUNTER_CLOCKWISE), + + FAIRY_RING_TELEPORT_BUTTON(WidgetID.FAIRY_RING_GROUP_ID, WidgetID.FairyRing.TELEPORT_BUTTON), + + WORLD_SWITCHER_BUTTON(WidgetID.LOGOUT_PANEL_ID, WidgetID.LogoutPanel.WORLD_SWITCHER_BUTTON), + LOGOUT_BUTTON(WidgetID.LOGOUT_PANEL_ID, WidgetID.LogoutPanel.LOGOUT_BUTTON), + + INVENTORY(WidgetID.INVENTORY_GROUP_ID, 0), + FRIENDS_LIST(WidgetID.FRIENDS_LIST_GROUP_ID, 0), + IGNORE_LIST(WidgetID.IGNORE_LIST_GROUP_ID, 0), + FRIENDS_CHAT(WidgetID.FRIENDS_CHAT_GROUP_ID, 0), + RAIDING_PARTY(WidgetID.RAIDING_PARTY_GROUP_ID, 0), + + WORLD_MAP_VIEW(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.MAPVIEW), + WORLD_MAP_OVERVIEW_MAP(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.OVERVIEW_MAP), + WORLD_MAP_BOTTOM_BAR(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.BOTTOM_BAR), + WORLD_MAP_SEARCH(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.SEARCH), + WORLD_MAP_SURFACE_SELECTOR(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.SURFACE_SELECTOR), + WORLD_MAP_TOOLTIP(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.TOOLTIP), + + CLUE_SCROLL_TEXT(WidgetID.CLUE_SCROLL_GROUP_ID, WidgetID.Cluescroll.CLUE_TEXT), + CLUE_SCROLL_REWARD_ITEM_CONTAINER(WidgetID.CLUE_SCROLL_REWARD_GROUP_ID, WidgetID.Cluescroll.CLUE_SCROLL_ITEM_CONTAINER), + + EQUIPMENT(WidgetID.EQUIPMENT_GROUP_ID, 0), + EQUIPMENT_INVENTORY_ITEMS_CONTAINER(WidgetID.EQUIPMENT_INVENTORY_GROUP_ID, WidgetID.Equipment.INVENTORY_ITEM_CONTAINER), + + EMOTE_WINDOW(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_WINDOW), + EMOTE_SCROLL_CONTAINER(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_SCROLL_CONTAINER), + EMOTE_CONTAINER(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_CONTAINER), + EMOTE_SCROLLBAR(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_SCROLLBAR), + + MUSIC_WINDOW(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.CONTAINER), + MUSIC_TRACK_LIST(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.LIST), + MUSIC_TRACK_SCROLL_CONTAINER(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.SCROLL_CONTAINER), + MUSIC_TRACK_SCROLLBAR(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.SCROLLBAR), + + DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), + DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), + + PEST_CONTROL_BOAT_INFO(WidgetID.PEST_CONTROL_BOAT_GROUP_ID, 2), + PEST_CONTROL_KNIGHT_INFO_CONTAINER(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.KNIGHT_INFO_CONTAINER), + PEST_CONTROL_ACTIVITY_SHIELD_INFO_CONTAINER(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.ACTIVITY_SHIELD_CONTAINER), + PEST_CONTROL_PURPLE_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.PURPLE_SHIELD), + PEST_CONTROL_BLUE_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.BLUE_SHIELD), + PEST_CONTROL_YELLOW_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.YELLOW_SHIELD), + PEST_CONTROL_RED_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.RED_SHIELD), + PEST_CONTROL_PURPLE_HEALTH(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.PURPLE_HEALTH), + PEST_CONTROL_BLUE_HEALTH(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.BLUE_HEALTH), + PEST_CONTROL_YELLOW_HEALTH(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.YELLOW_HEALTH), + PEST_CONTROL_RED_HEALTH(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.RED_HEALTH), + PEST_CONTROL_PURPLE_ICON(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.PURPLE_ICON), + PEST_CONTROL_BLUE_ICON(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.BLUE_ICON), + PEST_CONTROL_YELLOW_ICON(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.YELLOW_ICON), + PEST_CONTROL_RED_ICON(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.RED_ICON), + PEST_CONTROL_ACTIVITY_BAR(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.ACTIVITY_BAR), + PEST_CONTROL_ACTIVITY_PROGRESS(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.ACTIVITY_PROGRESS), + + VOLCANIC_MINE_TIME_LEFT(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.TIME_LEFT), + VOLCANIC_MINE_POINTS(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.POINTS), + VOLCANIC_MINE_STABILITY(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.STABILITY), + VOLCANIC_MINE_PLAYER_COUNT(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.PLAYER_COUNT), + VOLCANIC_MINE_VENTS_INFOBOX_GROUP(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENTS_INFOBOX_CONTAINER), + VOLCANIC_MINE_STABILITY_INFOBOX_GROUP(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.STABILITY_INFOBOX_CONTAINER), + VOLCANIC_MINE_VENT_A_PERCENTAGE(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_A_PERCENTAGE), + VOLCANIC_MINE_VENT_B_PERCENTAGE(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_B_PERCENTAGE), + VOLCANIC_MINE_VENT_C_PERCENTAGE(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_C_PERCENTAGE), + VOLCANIC_MINE_VENT_A_STATUS(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_A_STATUS), + VOLCANIC_MINE_VENT_B_STATUS(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_B_STATUS), + VOLCANIC_MINE_VENT_C_STATUS(WidgetID.VOLCANIC_MINE_GROUP_ID, WidgetID.VolcanicMine.VENT_C_STATUS), + + FRIEND_CHAT_TITLE(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.TITLE), + FRIEND_LIST_FULL_CONTAINER(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.FULL_CONTAINER), + FRIEND_LIST_SORT_BY_NAME_BUTTON(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.SORT_BY_NAME_BUTTON), + FRIEND_LIST_SORT_BY_LAST_WORLD_CHANGE_BUTTON(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.SORT_BY_LAST_WORLD_CHANGE_BUTTON), + FRIEND_LIST_SORT_BY_WORLD_BUTTON(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.SORT_BY_WORLD_BUTTON), + FRIEND_LIST_LEGACY_SORT_BUTTON(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.LEGACY_SORT_BUTTON), + FRIEND_LIST_NAMES_CONTAINER(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.NAMES_CONTAINER), + FRIEND_LIST_SCROLL_BAR(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.SCROLL_BAR), + FRIEND_LIST_LOADING_TEXT(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.LOADING_TEXT), + FRIEND_LIST_PREVIOUS_NAME_HOLDER(WidgetID.FRIENDS_LIST_GROUP_ID, WidgetID.FriendList.PREVIOUS_NAME_HOLDER), + + IGNORE_TITLE(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.TITLE), + IGNORE_FULL_CONTAINER(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.FULL_CONTAINER), + IGNORE_SORT_BY_NAME_BUTTON(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.SORT_BY_NAME_BUTTON), + IGNORE_LEGACY_SORT_BUTTON(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.LEGACY_SORT_BUTTON), + IGNORE_NAMES_CONTAINER(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.NAMES_CONTAINER), + IGNORE_SCROLL_BAR(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.SCROLL_BAR), + IGNORE_LOADING_TEXT(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.LOADING_TEXT), + IGNORE_PREVIOUS_NAME_HOLDER(WidgetID.IGNORE_LIST_GROUP_ID, WidgetID.IgnoreList.PREVIOUS_NAME_HOLDER), + + EXPLORERS_RING_ALCH_INVENTORY(WidgetID.EXPLORERS_RING_ALCH_GROUP_ID, WidgetID.ExplorersRing.INVENTORY), + + FRIENDS_CHAT_ROOT(WidgetID.FRIENDS_CHAT_GROUP_ID, WidgetID.FriendsChat.ROOT), + FRIENDS_CHAT_TITLE(WidgetID.FRIENDS_CHAT_GROUP_ID, WidgetID.FriendsChat.TITLE), + FRIENDS_CHAT_OWNER(WidgetID.FRIENDS_CHAT_GROUP_ID, WidgetID.FriendsChat.OWNER), + FRIENDS_CHAT_LIST(WidgetID.FRIENDS_CHAT_GROUP_ID, WidgetID.FriendsChat.LIST), + + BANK_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.BANK_CONTAINER), + BANK_SEARCH_BUTTON_BACKGROUND(WidgetID.BANK_GROUP_ID, WidgetID.Bank.SEARCH_BUTTON_BACKGROUND), + BANK_ITEM_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_CONTAINER), + BANK_INVENTORY_ITEMS_CONTAINER(WidgetID.BANK_INVENTORY_GROUP_ID, WidgetID.Bank.INVENTORY_ITEM_CONTAINER), + BANK_TITLE_BAR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.BANK_TITLE_BAR), + BANK_INCINERATOR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.INCINERATOR), + BANK_INCINERATOR_CONFIRM(WidgetID.BANK_GROUP_ID, WidgetID.Bank.INCINERATOR_CONFIRM), + BANK_CONTENT_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.CONTENT_CONTAINER), + BANK_DEPOSIT_EQUIPMENT(WidgetID.BANK_GROUP_ID, WidgetID.Bank.DEPOSIT_EQUIPMENT), + BANK_DEPOSIT_INVENTORY(WidgetID.BANK_GROUP_ID, WidgetID.Bank.DEPOSIT_INVENTORY), + BANK_TAB_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.TAB_CONTAINER), + BANK_EQUIPMENT_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.EQUIPMENT_CONTENT_CONTAINER), + BANK_EQUIPMENT_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.EQUIPMENT_BUTTON), + BANK_ITEM_COUNT_TOP(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_TOP), + BANK_ITEM_COUNT_BAR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_BAR), + BANK_ITEM_COUNT_BOTTOM(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_BOTTOM), + BANK_GROUP_STORAGE_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.GROUP_STORAGE_BUTTON), + BANK_SCROLLBAR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.SCROLLBAR), + BANK_PIN_CONTAINER(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.CONTAINER), + BANK_SETTINGS_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.SETTINGS_BUTTON), + BANK_TUTORIAL_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.TUTORIAL_BUTTON), + + GROUP_STORAGE_UI(WidgetID.GROUP_STORAGE_GROUP_ID, WidgetID.GroupStorage.UI), + GROUP_STORAGE_ITEM_CONTAINER(WidgetID.GROUP_STORAGE_GROUP_ID, WidgetID.GroupStorage.ITEM_CONTAINER), + + GRAND_EXCHANGE_WINDOW_CONTAINER(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.WINDOW_CONTAINER), + GRAND_EXCHANGE_OFFER_CONTAINER(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER_CONTAINER), + GRAND_EXCHANGE_OFFER_TEXT(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER_DESCRIPTION), + + GRAND_EXCHANGE_INVENTORY_ITEMS_CONTAINER(WidgetID.GRAND_EXCHANGE_INVENTORY_GROUP_ID, WidgetID.GrandExchangeInventory.INVENTORY_ITEM_CONTAINER), + + DEPOSIT_BOX_INVENTORY_ITEMS_CONTAINER(WidgetID.DEPOSIT_BOX_GROUP_ID, WidgetID.DepositBox.INVENTORY_ITEM_CONTAINER), + + SHOP_INVENTORY_ITEMS_CONTAINER(WidgetID.SHOP_INVENTORY_GROUP_ID, WidgetID.Shop.INVENTORY_ITEM_CONTAINER), + + SMITHING_INVENTORY_ITEMS_CONTAINER(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.INVENTORY_ITEM_CONTAINER), + + GUIDE_PRICES_ITEMS_CONTAINER(WidgetID.GUIDE_PRICES_GROUP_ID, WidgetID.GuidePrices.ITEM_CONTAINER), + GUIDE_PRICES_INVENTORY_ITEMS_CONTAINER(WidgetID.GUIDE_PRICES_INVENTORY_GROUP_ID, WidgetID.GuidePrices.INVENTORY_ITEM_CONTAINER), + + RUNE_POUCH_ITEM_CONTAINER(WidgetID.RUNE_POUCH_GROUP_ID, 0), + + MINIMAP_ORBS(WidgetID.MINIMAP_GROUP_ID, 0), + MINIMAP_XP_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.XP_ORB), + MINIMAP_PRAYER_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.PRAYER_ORB), + MINIMAP_QUICK_PRAYER_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.QUICK_PRAYER_ORB), + MINIMAP_PRAYER_ORB_TEXT(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.PRAYER_ORB_TEXT), + MINIMAP_RUN_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.RUN_ORB), + MINIMAP_TOGGLE_RUN_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.TOGGLE_RUN_ORB), + MINIMAP_RUN_ORB_TEXT(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.RUN_ORB_TEXT), + MINIMAP_HEALTH_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.HEALTH_ORB), + MINIMAP_SPEC_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.SPEC_ORB), + MINIMAP_SPEC_CLICKBOX(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.SPEC_CLICKBOX), + MINIMAP_WORLDMAP_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.WORLDMAP_ORB), + MINIMAP_WIKI_BANNER_PARENT(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.WIKI_BANNER_PARENT), + MINIMAP_WIKI_BANNER(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.WIKI_BANNER), + MINIMAP_WORLDMAP_OPTIONS(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.WORLDMAP_OPTIONS), + + LMS_INFO(WidgetID.LMS_GROUP_ID, WidgetID.Lms.INFO), + LMS_KDA(WidgetID.LMS_INGAME_GROUP_ID, WidgetID.LmsKDA.INFO), + + LOGIN_CLICK_TO_PLAY_SCREEN(WidgetID.LOGIN_CLICK_TO_PLAY_GROUP_ID, 0), + LOGIN_CLICK_TO_PLAY_SCREEN_MESSAGE_OF_THE_DAY(WidgetID.LOGIN_CLICK_TO_PLAY_GROUP_ID, WidgetID.LoginClickToPlayScreen.MESSAGE_OF_THE_DAY), + + FIXED_VIEWPORT(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.FIXED_VIEWPORT), + FIXED_VIEWPORT_ROOT_INTERFACE_CONTAINER(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.ROOT_INTERFACE_CONTAINER), + FIXED_VIEWPORT_BANK_CONTAINER(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.BANK_CONTAINER), + FIXED_VIEWPORT_INTERFACE_CONTAINER(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.INTERFACE_CONTAINER), + FIXED_VIEWPORT_INVENTORY_CONTAINER(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.INVENTORY_CONTAINER), + FIXED_VIEWPORT_COMBAT_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.COMBAT_TAB), + FIXED_VIEWPORT_STATS_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.STATS_TAB), + FIXED_VIEWPORT_QUESTS_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.QUESTS_TAB), + FIXED_VIEWPORT_INVENTORY_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.INVENTORY_TAB), + FIXED_VIEWPORT_EQUIPMENT_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.EQUIPMENT_TAB), + FIXED_VIEWPORT_PRAYER_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.PRAYER_TAB), + FIXED_VIEWPORT_MAGIC_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MAGIC_TAB), + FIXED_VIEWPORT_FRIENDS_CHAT_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.FRIENDS_CHAT_TAB), + FIXED_VIEWPORT_FRIENDS_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.FRIENDS_TAB), + FIXED_VIEWPORT_IGNORES_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.IGNORES_TAB), + FIXED_VIEWPORT_LOGOUT_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.LOGOUT_TAB), + FIXED_VIEWPORT_OPTIONS_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.OPTIONS_TAB), + FIXED_VIEWPORT_EMOTES_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.EMOTES_TAB), + FIXED_VIEWPORT_MUSIC_TAB(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MUSIC_TAB), + FIXED_VIEWPORT_COMBAT_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.COMBAT_ICON), + FIXED_VIEWPORT_STATS_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.STATS_ICON), + FIXED_VIEWPORT_QUESTS_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.QUESTS_ICON), + FIXED_VIEWPORT_INVENTORY_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.INVENTORY_ICON), + FIXED_VIEWPORT_EQUIPMENT_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.EQUIPMENT_ICON), + FIXED_VIEWPORT_PRAYER_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.PRAYER_ICON), + FIXED_VIEWPORT_MAGIC_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MAGIC_ICON), + FIXED_VIEWPORT_FRIENDS_CHAT_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.FRIENDS_CHAT_ICON), + FIXED_VIEWPORT_FRIENDS_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.FRIENDS_ICON), + FIXED_VIEWPORT_IGNORES_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.IGNORES_ICON), + FIXED_VIEWPORT_LOGOUT_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.LOGOUT_ICON), + FIXED_VIEWPORT_OPTIONS_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.OPTIONS_ICON), + FIXED_VIEWPORT_EMOTES_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.EMOTES_ICON), + FIXED_VIEWPORT_MUSIC_ICON(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MUSIC_ICON), + FIXED_VIEWPORT_MINIMAP(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MINIMAP), + FIXED_VIEWPORT_MINIMAP_DRAW_AREA(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MINIMAP_DRAW_AREA), + + RESIZABLE_MINIMAP_STONES_WIDGET(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MINIMAP), + RESIZABLE_MINIMAP_STONES_DRAW_AREA(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MINIMAP_DRAW_AREA), + RESIZABLE_MINIMAP_STONES_ORB_HOLDER(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MINIMAP_ORB_HOLDER), + RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX), + RESIZABLE_VIEWPORT_COMBAT_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.COMBAT_TAB), + RESIZABLE_VIEWPORT_STATS_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.STATS_TAB), + RESIZABLE_VIEWPORT_QUESTS_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.QUESTS_TAB), + RESIZABLE_VIEWPORT_INVENTORY_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.INVENTORY_TAB), + RESIZABLE_VIEWPORT_EQUIPMENT_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.EQUIPMENT_TAB), + RESIZABLE_VIEWPORT_PRAYER_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.PRAYER_TAB), + RESIZABLE_VIEWPORT_MAGIC_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MAGIC_TAB), + RESIZABLE_VIEWPORT_FRIENDS_CHAT_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.FRIENDS_CHAT_TAB), + RESIZABLE_VIEWPORT_FRIENDS_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.FRIENDS_TAB), + RESIZABLE_VIEWPORT_IGNORES_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.IGNORES_TAB), + RESIZABLE_VIEWPORT_LOGOUT_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.LOGOUT_TAB), + RESIZABLE_VIEWPORT_OPTIONS_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.OPTIONS_TAB), + RESIZABLE_VIEWPORT_EMOTES_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.EMOTES_TAB), + RESIZABLE_VIEWPORT_MUSIC_TAB(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MUSIC_TAB), + RESIZABLE_VIEWPORT_COMBAT_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.COMBAT_ICON), + RESIZABLE_VIEWPORT_STATS_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.STATS_ICON), + RESIZABLE_VIEWPORT_QUESTS_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.QUESTS_ICON), + RESIZABLE_VIEWPORT_INVENTORY_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.INVENTORY_ICON), + RESIZABLE_VIEWPORT_EQUIPMENT_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.EQUIPMENT_ICON), + RESIZABLE_VIEWPORT_PRAYER_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.PRAYER_ICON), + RESIZABLE_VIEWPORT_MAGIC_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MAGIC_ICON), + RESIZABLE_VIEWPORT_FRIENDS_CHAT_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.FRIENDS_CHAT_ICON), + RESIZABLE_VIEWPORT_FRIENDS_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.FRIENDS_ICON), + RESIZABLE_VIEWPORT_IGNORES_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.IGNORES_ICON), + RESIZABLE_VIEWPORT_LOGOUT_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.LOGOUT_ICON), + RESIZABLE_VIEWPORT_OPTIONS_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.OPTIONS_ICON), + RESIZABLE_VIEWPORT_EMOTES_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.EMOTES_ICON), + RESIZABLE_VIEWPORT_MUSIC_ICON(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MUSIC_ICON), + RESIZABLE_VIEWPORT_INTERFACE_CONTAINER(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.INTERFACE_CONTAINER), + RESIZABLE_VIEWPORT_INVENTORY_CONTAINER(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.INVENTORY_CONTAINER), + RESIZABLE_VIEWPORT_CHATBOX_PARENT(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.CHATBOX_PARENT), + RESIZABLE_VIEWPORT_INVENTORY_PARENT(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.INVENTORY_PARENT), + + RESIZABLE_MINIMAP_WIDGET(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MINIMAP), + RESIZABLE_MINIMAP_DRAW_AREA(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MINIMAP_DRAW_AREA), + RESIZABLE_MINIMAP_ORB_HOLDER(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MINIMAP_ORB_HOLDER), + RESIZABLE_MINIMAP_LOGOUT_BUTTON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MINIMAP_LOGOUT_BUTTON), + RESIZABLE_VIEWPORT_BOTTOM_LINE(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.RESIZABLE_VIEWPORT_BOTTOM_LINE), + RESIZABLE_VIEWPORT_BOTTOM_LINE_LOGOUT_BUTTON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.LOGOUT_BUTTON_OVERLAY), + RESIZABLE_VIEWPORT_BOTTOM_LINE_QUESTS_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.QUESTS_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.INVENTORY_TAB), + RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.INVENTORY_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_TAB(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.PRAYER_TAB), + RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.PRAYER_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_EQUIPMENT_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.EQUIP_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_COMBAT_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.CMB_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_STATS_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.SKILLS_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_MAGIC_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MAGIC_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_FRIEND_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.FRIEND_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_FRIEND_CHAT_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.FC_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_OPTIONS_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.SETTINGS_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_EMOTES_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.EMOTE_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_MUSIC_ICON(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MUSIC_ICON), + RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_CONTAINER(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.INVENTORY_CONTAINER), + RESIZABLE_VIEWPORT_BOTTOM_LINE_INTERFACE_CONTAINER(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.INTERFACE_CONTAINER), + RESIZABLE_VIEWPORT_BOTTOM_LINE_CHATBOX_PARENT(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.CHATBOX_PARENT), + RESIZABLE_VIEWPORT_BOTTOM_LINE_TABS1(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.TABS1), + RESIZABLE_VIEWPORT_BOTTOM_LINE_TABS2(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.TABS2), + RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_PARENT(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.INVENTORY_PARENT), + + PRAYER_THICK_SKIN(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.THICK_SKIN), + PRAYER_BURST_OF_STRENGTH(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.BURST_OF_STRENGTH), + PRAYER_CLARITY_OF_THOUGHT(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.CLARITY_OF_THOUGHT), + PRAYER_SHARP_EYE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.SHARP_EYE), + PRAYER_MYSTIC_WILL(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.MYSTIC_WILL), + PRAYER_ROCK_SKIN(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.ROCK_SKIN), + PRAYER_SUPERHUMAN_STRENGTH(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.SUPERHUMAN_STRENGTH), + PRAYER_IMPROVED_REFLEXES(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.IMPROVED_REFLEXES), + PRAYER_RAPID_RESTORE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.RAPID_RESTORE), + PRAYER_RAPID_HEAL(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.RAPID_HEAL), + PRAYER_PROTECT_ITEM(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_ITEM), + PRAYER_HAWK_EYE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.HAWK_EYE), + PRAYER_MYSTIC_LORE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.MYSTIC_LORE), + PRAYER_STEEL_SKIN(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.STEEL_SKIN), + PRAYER_ULTIMATE_STRENGTH(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.ULTIMATE_STRENGTH), + PRAYER_INCREDIBLE_REFLEXES(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.INCREDIBLE_REFLEXES), + PRAYER_PROTECT_FROM_MAGIC(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MAGIC), + PRAYER_PROTECT_FROM_MISSILES(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MISSILES), + PRAYER_PROTECT_FROM_MELEE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PROTECT_FROM_MELEE), + PRAYER_EAGLE_EYE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.EAGLE_EYE), + PRAYER_MYSTIC_MIGHT(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.MYSTIC_MIGHT), + PRAYER_RETRIBUTION(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.RETRIBUTION), + PRAYER_REDEMPTION(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.REDEMPTION), + PRAYER_SMITE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.SMITE), + PRAYER_PRESERVE(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PRESERVE), + PRAYER_CHIVALRY(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.CHIVALRY), + PRAYER_PIETY(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.PIETY), + PRAYER_RIGOUR(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.RIGOUR), + PRAYER_AUGURY(WidgetID.PRAYER_GROUP_ID, WidgetID.Prayer.AUGURY), + QUICK_PRAYER_PRAYERS(WidgetID.QUICK_PRAYERS_GROUP_ID, WidgetID.QuickPrayer.PRAYERS), + + COMBAT_LEVEL(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.LEVEL), + COMBAT_STYLE_ONE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_ONE), + COMBAT_STYLE_TWO(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_TWO), + COMBAT_STYLE_THREE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_THREE), + COMBAT_STYLE_FOUR(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_FOUR), + COMBAT_SPELLS(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPELLS), + COMBAT_DEFENSIVE_SPELL_BOX(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.DEFENSIVE_SPELL_BOX), + COMBAT_DEFENSIVE_SPELL_ICON(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.DEFENSIVE_SPELL_ICON), + COMBAT_DEFENSIVE_SPELL_SHIELD(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.DEFENSIVE_SPELL_SHIELD), + COMBAT_DEFENSIVE_SPELL_TEXT(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.DEFENSIVE_SPELL_TEXT), + COMBAT_SPELL_BOX(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPELL_BOX), + COMBAT_SPELL_ICON(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPELL_ICON), + COMBAT_SPELL_TEXT(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPELL_TEXT), + COMBAT_AUTO_RETALIATE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.AUTO_RETALIATE), + + DIALOG_OPTION(WidgetID.DIALOG_OPTION_GROUP_ID, 0), + DIALOG_OPTION_OPTIONS(WidgetID.DIALOG_OPTION_GROUP_ID, WidgetID.DialogOption.OPTIONS), + + DIALOG_SPRITE(WidgetID.DIALOG_SPRITE_GROUP_ID, 0), + DIALOG_SPRITE_SPRITE(WidgetID.DIALOG_SPRITE_GROUP_ID, WidgetID.DialogSprite.SPRITE), + DIALOG_SPRITE_TEXT(WidgetID.DIALOG_SPRITE_GROUP_ID, WidgetID.DialogSprite.TEXT), + + DIALOG_NPC_NAME(WidgetID.DIALOG_NPC_GROUP_ID, WidgetID.DialogNPC.NAME), + DIALOG_NPC_TEXT(WidgetID.DIALOG_NPC_GROUP_ID, WidgetID.DialogNPC.TEXT), + DIALOG_NPC_HEAD_MODEL(WidgetID.DIALOG_NPC_GROUP_ID, WidgetID.DialogNPC.HEAD_MODEL), + + DIALOG_PLAYER(WidgetID.DIALOG_PLAYER_GROUP_ID, 0), + DIALOG_PLAYER_TEXT(WidgetID.DIALOG_PLAYER_GROUP_ID, WidgetID.DialogPlayer.TEXT), + + PRIVATE_CHAT_MESSAGE(WidgetID.PRIVATE_CHAT, 0), + + SLAYER_REWARDS_TOPBAR(WidgetID.SLAYER_REWARDS_GROUP_ID, WidgetID.SlayerRewards.TOP_BAR), + + CHATBOX_PARENT(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.PARENT), + CHATBOX(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.FRAME), + CHATBOX_MESSAGES(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.MESSAGES), + CHATBOX_BUTTONS(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.BUTTONS), + CHATBOX_TITLE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TITLE), + CHATBOX_FULL_INPUT(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.FULL_INPUT), + CHATBOX_GE_SEARCH_RESULTS(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.GE_SEARCH_RESULTS), + CHATBOX_CONTAINER(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.CONTAINER), + CHATBOX_REPORT_TEXT(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.REPORT_TEXT), + CHATBOX_INPUT(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.INPUT), + CHATBOX_TRANSPARENT_BACKGROUND(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TRANSPARENT_BACKGROUND), + CHATBOX_TRANSPARENT_LINES(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TRANSPARENT_BACKGROUND_LINES), + CHATBOX_MESSAGE_LINES(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.MESSAGE_LINES), + CHATBOX_FIRST_MESSAGE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.FIRST_MESSAGE), + CHATBOX_TAB_ALL(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_ALL), + CHATBOX_TAB_GAME(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_GAME), + CHATBOX_TAB_PUBLIC(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_PUBLIC), + CHATBOX_TAB_PRIVATE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_PRIVATE), + CHATBOX_TAB_CHANNEL(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_CHANNEL), + CHATBOX_TAB_CLAN(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_CLAN), + CHATBOX_TAB_TRADE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_TRADE), + + BA_TEAM(WidgetID.BA_TEAM_GROUP_ID, WidgetID.BarbarianAssault.TEAM), + + BA_HEAL_ROLE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), + BA_HEAL_ROLE_SPRITE(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), + + BA_HEAL_TEAMMATES(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATES), + BA_HEAL_TEAMMATE1(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE1), + BA_HEAL_TEAMMATE2(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE2), + BA_HEAL_TEAMMATE3(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE3), + BA_HEAL_TEAMMATE4(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE4), + + BA_COLL_ROLE_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE), + BA_COLL_ROLE_SPRITE(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), + + BA_ATK_ROLE_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE), + BA_ATK_ROLE_SPRITE(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE_SPRITE), + + BA_DEF_ROLE_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), + BA_DEF_ROLE_SPRITE(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), + + BA_REWARD_TEXT(WidgetID.BA_REWARD_GROUP_ID, WidgetID.BarbarianAssault.REWARD_TEXT), + + LEVEL_UP(WidgetID.LEVEL_UP_GROUP_ID, 0), + LEVEL_UP_SKILL(WidgetID.LEVEL_UP_GROUP_ID, WidgetID.LevelUp.SKILL), + LEVEL_UP_LEVEL(WidgetID.LEVEL_UP_GROUP_ID, WidgetID.LevelUp.LEVEL), + + QUEST_COMPLETED(WidgetID.QUEST_COMPLETED_GROUP_ID, 0), + QUEST_COMPLETED_NAME_TEXT(WidgetID.QUEST_COMPLETED_GROUP_ID, WidgetID.QuestCompleted.NAME_TEXT), + + MOTHERLODE_MINE(WidgetID.MOTHERLODE_MINE_GROUP_ID, 0), + + GWD_KC(WidgetID.GWD_KC_GROUP_ID, 5), + + PUZZLE_BOX(WidgetID.PUZZLE_BOX_GROUP_ID, WidgetID.PuzzleBox.VISIBLE_BOX), + + LIGHT_BOX(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.LIGHT_BOX), + LIGHT_BOX_CONTENTS(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.LIGHT_BULB_CONTAINER), + LIGHT_BOX_BUTTON_A(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_A), + LIGHT_BOX_BUTTON_B(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_B), + LIGHT_BOX_BUTTON_C(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_C), + LIGHT_BOX_BUTTON_D(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_D), + LIGHT_BOX_BUTTON_E(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_E), + LIGHT_BOX_BUTTON_F(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_F), + LIGHT_BOX_BUTTON_G(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_G), + LIGHT_BOX_BUTTON_H(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.BUTTON_H), + + LIGHT_BOX_WINDOW(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.LIGHT_BOX_WINDOW), + + NIGHTMARE_ZONE(WidgetID.NIGHTMARE_ZONE_GROUP_ID, 0), + + NIGHTMARE_PILLAR_HEALTH(WidgetID.NIGHTMARE_PILLAR_HEALTH_GROUP_ID, 1), + + RAIDS_POINTS_INFOBOX(WidgetID.RAIDS_GROUP_ID, WidgetID.Raids.POINTS_INFOBOX), + + RAIDS_PRIVATE_STORAGE_ITEM_CONTAINER(WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_PRIVATE_GROUP_ID, WidgetID.ChambersOfXericStorageUnitPrivate.PRIVATE_CHEST_ITEM_CONTAINER), + + TOB_PARTY_INTERFACE(WidgetID.TOB_GROUP_ID, WidgetID.Tob.PARTY_INTERFACE), + TOB_PARTY_STATS(WidgetID.TOB_GROUP_ID, WidgetID.Tob.PARTY_STATS), + TOB_HEALTH_BAR(WidgetID.TOB_GROUP_ID, WidgetID.Tob.HEALTHBAR_CONTAINER), + + BLAST_FURNACE_COFFER(WidgetID.BLAST_FURNACE_GROUP_ID, 2), + + PYRAMID_PLUNDER_DATA(WidgetID.PYRAMID_PLUNDER_GROUP_ID, 2), + + EXPERIENCE_TRACKER(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, 0), + EXPERIENCE_TRACKER_WIDGET(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.WIDGET), + EXPERIENCE_TRACKER_BOTTOM_BAR(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.BOTTOM_BAR), + + FISHING_TRAWLER_CONTRIBUTION(WidgetID.FISHING_TRAWLER_GROUP_ID, 13), + FISHING_TRAWLER_TIMER(WidgetID.FISHING_TRAWLER_GROUP_ID, 14), + + TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 2), + + BARROWS_BROTHERS(WidgetID.BARROWS_GROUP_ID, WidgetID.Barrows.BARROWS_BROTHERS), + BARROWS_POTENTIAL(WidgetID.BARROWS_GROUP_ID, WidgetID.Barrows.BARROWS_POTENTIAL), + BARROWS_PUZZLE_PARENT(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.PARENT), + BARROWS_PUZZLE_ANSWER1(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER1), + BARROWS_PUZZLE_ANSWER1_CONTAINER(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER1_CONTAINER), + BARROWS_PUZZLE_ANSWER2(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER2), + BARROWS_PUZZLE_ANSWER2_CONTAINER(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER2_CONTAINER), + BARROWS_PUZZLE_ANSWER3(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER3), + BARROWS_PUZZLE_ANSWER3_CONTAINER(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.ANSWER3_CONTAINER), + BARROWS_FIRST_PUZZLE(WidgetID.BARROWS_PUZZLE_GROUP_ID, WidgetID.Barrows_Puzzle.SEQUENCE_1), + + BLAST_MINE(WidgetID.BLAST_MINE_GROUP_ID, 2), + + FAIRY_RING(WidgetID.FAIRY_RING_GROUP_ID, 0), + + FAIRY_RING_HEADER(WidgetID.FAIRY_RING_PANEL_GROUP_ID, WidgetID.FairyRingPanel.HEADER), + FAIRY_RING_LIST(WidgetID.FAIRY_RING_PANEL_GROUP_ID, WidgetID.FairyRingPanel.LIST), + FAIRY_RING_FAVORITES(WidgetID.FAIRY_RING_PANEL_GROUP_ID, WidgetID.FairyRingPanel.FAVORITES), + FAIRY_RING_LIST_SEPARATOR(WidgetID.FAIRY_RING_PANEL_GROUP_ID, WidgetID.FairyRingPanel.SEPARATOR), + FAIRY_RING_LIST_SCROLLBAR(WidgetID.FAIRY_RING_PANEL_GROUP_ID, WidgetID.FairyRingPanel.SCROLLBAR), + + DESTROY_ITEM(WidgetID.DESTROY_ITEM_GROUP_ID, 0), + DESTROY_ITEM_NAME(WidgetID.DESTROY_ITEM_GROUP_ID, WidgetID.DestroyItem.DESTROY_ITEM_NAME), + DESTROY_ITEM_YES(WidgetID.DESTROY_ITEM_GROUP_ID, WidgetID.DestroyItem.DESTROY_ITEM_YES), + DESTROY_ITEM_NO(WidgetID.DESTROY_ITEM_GROUP_ID, WidgetID.DestroyItem.DESTROY_ITEM_NO), + + VARROCK_MUSEUM_QUESTION(WidgetID.VARROCK_MUSEUM_QUIZ_GROUP_ID, WidgetID.VarrockMuseum.VARROCK_MUSEUM_QUESTION), + VARROCK_MUSEUM_FIRST_ANSWER(WidgetID.VARROCK_MUSEUM_QUIZ_GROUP_ID, WidgetID.VarrockMuseum.VARROCK_MUSEUM_FIRST_ANSWER), + VARROCK_MUSEUM_SECOND_ANSWER(WidgetID.VARROCK_MUSEUM_QUIZ_GROUP_ID, WidgetID.VarrockMuseum.VARROCK_MUSEUM_SECOND_ANSWER), + VARROCK_MUSEUM_THIRD_ANSWER(WidgetID.VARROCK_MUSEUM_QUIZ_GROUP_ID, WidgetID.VarrockMuseum.VARROCK_MUSEUM_THIRD_ANSWER), + + KILL_LOG_TITLE(WidgetID.KILL_LOGS_GROUP_ID, WidgetID.KillLog.TITLE), + KILL_LOG_MONSTER(WidgetID.KILL_LOGS_GROUP_ID, WidgetID.KillLog.MONSTER), + KILL_LOG_KILLS(WidgetID.KILL_LOGS_GROUP_ID, WidgetID.KillLog.KILLS), + KILL_LOG_STREAK(WidgetID.KILL_LOGS_GROUP_ID, WidgetID.KillLog.STREAK), + + ADVENTURE_LOG(WidgetID.ADVENTURE_LOG_ID, WidgetID.AdventureLog.CONTAINER), + + COLLECTION_LOG(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.CONTAINER), + + COLLECTION_LOG_TABS(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.TABS), + COLLECTION_LOG_ENTRY(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY), + COLLECTION_LOG_ENTRY_HEADER(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY_HEADER), + COLLECTION_LOG_ENTRY_ITEMS(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY_ITEMS), + + GENERIC_SCROLL_TEXT(WidgetID.GENERIC_SCROLL_GROUP_ID, WidgetID.GenericScroll.TEXT), + + WORLD_SWITCHER_LIST(WidgetID.WORLD_SWITCHER_GROUP_ID, WidgetID.WorldSwitcher.WORLD_LIST), + + FOSSIL_ISLAND_OXYGENBAR(WidgetID.FOSSIL_ISLAND_OXYGENBAR_ID, 1), + + MINIGAME_TELEPORT_BUTTON(WidgetID.MINIGAME_TAB_ID, WidgetID.Minigames.TELEPORT_BUTTON), + + SPELL_LUMBRIDGE_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.StandardSpellBook.LUMBRIDGE_HOME_TELEPORT), + SPELL_EDGEVILLE_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.AncientSpellBook.EDGEVILLE_HOME_TELEPORT), + SPELL_LUNAR_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.LunarSpellBook.LUNAR_HOME_TELEPORT), + SPELL_ARCEUUS_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.ArceuusSpellBook.ARCEUUS_HOME_TELEPORT), + SPELL_KOUREND_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.StandardSpellBook.KOUREND_HOME_TELEPORT), + SPELL_CATHERBY_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.StandardSpellBook.CATHERBY_HOME_TELEPORT), + SPELL_LUNAR_FERTILE_SOIL(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.LunarSpellBook.FERTILE_SOIL), + + PVP_WILDERNESS_SKULL_CONTAINER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.WILDERNESS_SKULL_CONTAINER), + PVP_SKULL_CONTAINER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SKULL_CONTAINER), + PVP_WORLD_SAFE_ZONE(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SAFE_ZONE), + + PVP_WILDERNESS_LEVEL(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.WILDERNESS_LEVEL), + PVP_KILLDEATH_COUNTER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.KILLDEATH_RATIO), + + KOUREND_FAVOUR_OVERLAY(WidgetID.KOUREND_FAVOUR_GROUP_ID, WidgetID.KourendFavour.KOUREND_FAVOUR_OVERLAY), + ZEAH_MESS_HALL_COOKING_DISPLAY(WidgetID.ZEAH_MESS_HALL_GROUP_ID, WidgetID.Zeah.MESS_HALL_COOKING_DISPLAY), + + LOOTING_BAG_CONTAINER(WidgetID.LOOTING_BAG_GROUP_ID, WidgetID.LootingBag.LOOTING_BAG_INVENTORY), + + SKOTIZO_CONTAINER(WidgetID.SKOTIZO_GROUP_ID, WidgetID.Skotizo.CONTAINER), + + QUESTLIST_BOX(WidgetID.QUESTLIST_GROUP_ID, WidgetID.QuestList.BOX), + QUESTLIST_CONTAINER(WidgetID.QUESTLIST_GROUP_ID, WidgetID.QuestList.CONTAINER), + + SEED_VAULT_TITLE_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.TITLE_CONTAINER), + SEED_VAULT_ITEM_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_CONTAINER), + SEED_VAULT_ITEM_TEXT(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_TEXT), + SEED_VAULT_INVENTORY_ITEMS_CONTAINER(WidgetID.SEED_VAULT_INVENTORY_GROUP_ID, WidgetID.SeedVault.INVENTORY_ITEM_CONTAINER), + + SETTINGS_SIDE_CAMERA_ZOOM_SLIDER_TRACK(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.CAMERA_ZOOM_SLIDER_TRACK), + SETTINGS_SIDE_MUSIC_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.MUSIC_SLIDER), + SETTINGS_SIDE_SOUND_EFFECT_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.SOUND_EFFECT_SLIDER), + SETTINGS_SIDE_AREA_SOUND_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.AREA_SOUND_SLIDER), + + SETTINGS_INIT(WidgetID.SETTINGS_GROUP_ID, WidgetID.Settings.INIT), + + ACHIEVEMENT_DIARY_CONTAINER(WidgetID.ACHIEVEMENT_DIARY_GROUP_ID, WidgetID.AchievementDiary.CONTAINER), + + SKILLS_CONTAINER(WidgetID.SKILLS_GROUP_ID, WidgetID.Skills.CONTAINER), + + GAUNTLET_TIMER_CONTAINER(WidgetID.GAUNTLET_TIMER_GROUP_ID, WidgetID.GauntletTimer.CONTAINER), + HALLOWED_SEPULCHRE_TIMER_CONTAINER(WidgetID.HALLOWED_SEPULCHRE_TIMER_GROUP_ID, WidgetID.HallowedSepulchreTimer.CONTAINER), + + HEALTH_OVERLAY_BAR(WidgetID.HEALTH_OVERLAY_BAR_GROUP_ID, WidgetID.Health.HEALTHBAR_CONTAINER), + HEALTH_OVERLAY_BAR_TEXT(WidgetID.HEALTH_OVERLAY_BAR_GROUP_ID, WidgetID.Health.HEALTHBAR_TEXT), + + TRAILBLAZER_AREA_TELEPORT(WidgetID.TRAILBLAZER_AREAS_GROUP_ID, WidgetID.TrailblazerAreas.TELEPORT), + + MULTICOMBAT_FIXED(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MULTICOMBAT_INDICATOR), + MULTICOMBAT_RESIZABLE_MODERN(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewport.MULTICOMBAT_INDICATOR), + MULTICOMBAT_RESIZABLE_CLASSIC(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.MULTICOMBAT_INDICATOR), + + TEMPOROSS_STATUS_INDICATOR(WidgetID.TEMPOROSS_GROUP_ID, WidgetID.TemporossStatus.STATUS_INDICATOR), + + CLAN_LAYER(WidgetID.CLAN_GROUP_ID, WidgetID.Clan.LAYER), + CLAN_HEADER(WidgetID.CLAN_GROUP_ID, WidgetID.Clan.HEADER), + CLAN_MEMBER_LIST(WidgetID.CLAN_GROUP_ID, WidgetID.Clan.MEMBERS), + + CLAN_GUEST_LAYER(WidgetID.CLAN_GUEST_GROUP_ID, WidgetID.ClanGuest.LAYER), + CLAN_GUEST_HEADER(WidgetID.CLAN_GUEST_GROUP_ID, WidgetID.ClanGuest.HEADER), + CLAN_GUEST_MEMBER_LIST(WidgetID.CLAN_GUEST_GROUP_ID, WidgetID.ClanGuest.MEMBERS), + + POH_TREASURE_CHEST_INVENTORY_CONTAINER(WidgetID.POH_TREASURE_CHEST_INVENTORY_GROUP_ID, 0), + + TRADE_WINDOW_HEADER(WidgetID.TRADE_WINDOW_GROUP_ID, WidgetID.Trade.HEADER), + + TOA_PARTY_LAYER(WidgetID.TOA_PARTY_GROUP_ID, 2), + TOA_RAID_LAYER(WidgetID.TOA_RAID_GROUP_ID, 3), + EQUIPMENT_HELMET(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.HELMET), + EQUIPMENT_CAPE(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.CAPE), + EQUIPMENT_AMULET(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.AMULET), + EQUIPMENT_WEAPON(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.WEAPON), + EQUIPMENT_BODY(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.BODY), + EQUIPMENT_SHIELD(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.SHIELD), + EQUIPMENT_LEGS(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.LEGS), + EQUIPMENT_GLOVES(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.GLOVES), + EQUIPMENT_BOOTS(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.BOOTS), + EQUIPMENT_RING(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.RING), + EQUIPMENT_AMMO(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.AMMO), + + BANK_PIN_TOP_LEFT_TEXT(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.TOP_LEFT_TEXT), + BANK_PIN_EXIT_BUTTON(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.EXIT_BUTTON), + BANK_PIN_FORGOT_BUTTON(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.FORGOT_BUTTON), + BANK_PIN_FIRST_ENTERED(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.FIRST_ENTERED), + BANK_PIN_SECOND_ENTERED(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.SECOND_ENTERED), + BANK_PIN_THIRD_ENTERED(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.THIRD_ENTERED), + BANK_PIN_FOURTH_ENTERED(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.FOURTH_ENTERED), + BANK_PIN_INSTRUCTION_TEXT(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.INSTRUCTION_TEXT), + BANK_PIN_1(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_1), + BANK_PIN_2(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_2), + BANK_PIN_3(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_3), + BANK_PIN_4(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_4), + BANK_PIN_5(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_5), + BANK_PIN_6(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_6), + BANK_PIN_7(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_7), + BANK_PIN_8(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_8), + BANK_PIN_9(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_9), + BANK_PIN_10(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.BUTTON_10), + RESIZABLE_VIEWPORT_BOTTOM_LINE_MAGIC_TAB(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewportBottomLine.MAGIC_TAB), + MINIGAME_DIALOG(WidgetID.DIALOG_MINIGAME_GROUP_ID, 0), + MINIGAME_DIALOG_TEXT(WidgetID.DIALOG_MINIGAME_GROUP_ID, WidgetID.MinigameDialog.TEXT), + MINIGAME_DIALOG_CONTINUE(WidgetID.DIALOG_MINIGAME_GROUP_ID, WidgetID.MinigameDialog.CONTINUE), + PEST_CONTROL_EXCHANGE_WINDOW(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, 0), + PEST_CONTROL_EXCHANGE_WINDOW_POINTS(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, WidgetID.PestControlExchangeWindow.POINTS), + + GRAND_EXCHANGE_HISTORY_BUTTON(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.HISTORY_BUTTON), + GRAND_EXCHANGE_BACK_BUTTON(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.BACK_BUTTON), + GRAND_EXCHANGE_OFFER1(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER1), + GRAND_EXCHANGE_OFFER2(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER2), + GRAND_EXCHANGE_OFFER3(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER3), + GRAND_EXCHANGE_OFFER4(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER4), + GRAND_EXCHANGE_OFFER5(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER5), + GRAND_EXCHANGE_OFFER6(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER6), + GRAND_EXCHANGE_OFFER7(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER7), + GRAND_EXCHANGE_OFFER8(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER8), + + GRAND_EXCHANGE_OFFER_CONFIRM_BUTTON(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER_CONFIRM_BUTTON), + + SMITHING_ANVIL_DAGGER(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.DAGGER), + SMITHING_ANVIL_SWORD(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.SWORD), + SMITHING_ANVIL_SCIMITAR(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.SCIMITAR), + SMITHING_ANVIL_LONG_SWORD(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.LONG_SWORD), + SMITHING_ANVIL_TWO_H_SWORD(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.TWO_H_SWORD), + SMITHING_ANVIL_AXE(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.AXE), + SMITHING_ANVIL_MACE(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.MACE), + SMITHING_ANVIL_WARHAMMER(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.WARHAMMER), + SMITHING_ANVIL_BATTLE_AXE(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.BATTLE_AXE), + SMITHING_ANVIL_CLAWS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.CLAWS), + SMITHING_ANVIL_CHAIN_BODY(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.CHAIN_BODY), + SMITHING_ANVIL_PLATE_LEGS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.PLATE_LEGS), + SMITHING_ANVIL_PLATE_SKIRT(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.PLATE_SKIRT), + SMITHING_ANVIL_PLATE_BODY(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.PLATE_BODY), + SMITHING_ANVIL_NAILS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.NAILS), + SMITHING_ANVIL_MED_HELM(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.MED_HELM), + SMITHING_ANVIL_FULL_HELM(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.FULL_HELM), + SMITHING_ANVIL_SQ_SHIELD(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.SQ_SHIELD), + SMITHING_ANVIL_KITE_SHIELD(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.KITE_SHIELD), + SMITHING_ANVIL_DART_TIPS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.DART_TIPS), + SMITHING_ANVIL_ARROW_HEADS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.ARROW_HEADS), + SMITHING_ANVIL_KNIVES(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.KNIVES), + SMITHING_ANVIL_JAVELIN_HEADS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.JAVELIN_HEADS), + SMITHING_ANVIL_BOLTS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.BOLTS), + SMITHING_ANVIL_LIMBS(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.LIMBS), + SMITHING_ANVIL_EXCLUSIVE1(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.EXCLUSIVE1), + SMITHING_ANVIL_EXCLUSIVE2(WidgetID.SMITHING_GROUP_ID, WidgetID.Smithing.EXCLUSIVE2), + + MINIMAP_WORLD_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.WORLDMAP_ORB), + + COMBAT_WEAPON(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.WEAPON_NAME), + + COMBAT_SPECIAL_ATTACK(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPECIAL_ATTACK_BAR), + COMBAT_SPECIAL_ATTACK_CLICKBOX(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.SPECIAL_ATTACK_CLICKBOX), + COMBAT_TOOLTIP(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.TOOLTIP), + + MULTI_SKILL_MENU(WidgetID.MULTISKILL_MENU_GROUP_ID, 0), + + DIALOG2_SPRITE(WidgetID.DIALOG_SPRITE2_ID, 0), + DIALOG2_SPRITE_SPRITE1(WidgetID.DIALOG_SPRITE2_ID, WidgetID.DialogSprite2.SPRITE1), + DIALOG2_SPRITE_SPRITE2(WidgetID.DIALOG_SPRITE2_ID, WidgetID.DialogSprite2.SPRITE2), + DIALOG2_SPRITE_TEXT(WidgetID.DIALOG_SPRITE2_ID, WidgetID.DialogSprite2.TEXT), + DIALOG2_SPRITE_CONTINUE(WidgetID.DIALOG_SPRITE2_ID, WidgetID.DialogSprite2.CONTINUE), + + DIALOG_OPTION_OPTION1(WidgetID.DIALOG_OPTION_GROUP_ID, WidgetID.DialogOption.OPTIONS), + + DIALOG_NOTIFICATION_TEXT(WidgetID.DIALOG_NOTIFICATION_GROUP_ID, WidgetID.DialogNotification.TEXT), + DIALOG_NOTIFICATION_CONTINUE(WidgetID.DIALOG_NOTIFICATION_GROUP_ID, WidgetID.DialogNotification.CONTINUE), + + LEVEL_UP_CONTINUE(WidgetID.LEVEL_UP_GROUP_ID, WidgetID.LevelUp.CONTINUE), + + THEATRE_OF_BLOOD_PARTY(WidgetID.THEATRE_OF_BLOOD_PARTY_GROUP_ID, WidgetID.TheatreOfBloodParty.CONTAINER), + + LIGHT_BOX_BUTTON_CONTAINER(WidgetID.LIGHT_BOX_GROUP_ID, WidgetID.LightBox.LIGHT_BOX_BUTTON_CONTAINER), + + THEATRE_OF_BLOOD_HEALTH_ORBS(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.ORB_BOX), + THEATRE_OF_BLOOD_BOSS_HEALTH(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.BOSS_HEALTH_BAR), + THEATRE_OF_BLOOD_RAIDING_PARTY(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.RAIDING_PARTY), + + WORLD_SWITCHER_CONTAINER(WidgetID.WORLD_SWITCHER_GROUP_ID, WidgetID.WorldSwitcher.CONTAINER), + + WORLD_SWITCHER_LOGOUT_BUTTON(WidgetID.WORLD_SWITCHER_GROUP_ID, WidgetID.WorldSwitcher.LOGOUT_BUTTON), + + FOSSIL_MUSHROOM_TELEPORT(WidgetID.FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID, WidgetID.FossilMushroomTeleport.ROOT), + FOSSIL_MUSHROOM_HOUSE(WidgetID.FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID, WidgetID.FossilMushroomTeleport.HOUSE_ON_HILL), + FOSSIL_MUSHROOM_VALLEY(WidgetID.FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID, WidgetID.FossilMushroomTeleport.VERDANT_VALLEY), + FOSSIL_MUSHROOM_SWAMP(WidgetID.FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID, WidgetID.FossilMushroomTeleport.SWAMP), + FOSSIL_MUSHROOM_MEADOW(WidgetID.FOSSIL_ISLAND_MUSHROOM_TELE_GROUP_ID, WidgetID.FossilMushroomTeleport.MUSHROOM_MEADOW), + + SPELLBOOK(WidgetID.SPELLBOOK_GROUP_ID, 0), + SPELLBOOK_FILTERED_BOUNDS(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FILTERED_SPELLS_BOUNDS), + + /* STANDARD SPELL BOOK WIDGETS*/ + SPELL_WIND_STRIKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WIND_STRIKE), + SPELL_CONFUSE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CONFUSE), + SPELL_ENCHANT_CROSSBOW_BOLT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ENCHANT_CROSSBOW_BOLT), + SPELL_WATER_STRIKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATER_STRIKE), + SPELL_LVL_1_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_1_ENCHANT), + SPELL_EARTH_STRIKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EARTH_STRIKE), + SPELL_WEAKEN(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WEAKEN), + SPELL_FIRE_STRIKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FIRE_STRIKE), + SPELL_BONES_TO_BANANAS(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BONES_TO_BANANAS), + SPELL_WIND_BOLT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WIND_BOLT), + SPELL_CURSE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CURSE), + SPELL_BIND(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BIND), + SPELL_LOW_LEVEL_ALCHEMY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LOW_LEVEL_ALCHEMY), + SPELL_WATER_BOLT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATER_BOLT), + SPELL_VARROCK_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.VARROCK_TELEPORT), + SPELL_LVL_2_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_2_ENCHANT), + SPELL_EARTH_BOLT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EARTH_BOLT), + SPELL_LUMBRIDGE_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LUMBRIDGE_TELEPORT), + SPELL_TELEKINETIC_GRAB(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEKINETIC_GRAB), + SPELL_FIRE_BOLT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FIRE_BOLT), + SPELL_FALADOR_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FALADOR_TELEPORT), + SPELL_CRUMBLE_UNDEAD(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CRUMBLE_UNDEAD), + SPELL_TELEPORT_TO_HOUSE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEPORT_TO_HOUSE), + SPELL_WIND_BLAST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WIND_BLAST), + SPELL_SUPERHEAT_ITEM(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SUPERHEAT_ITEM), + SPELL_CAMELOT_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CAMELOT_TELEPORT), + SPELL_WATER_BLAST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATER_BLAST), + SPELL_LVL_3_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_3_ENCHANT), + SPELL_IBAN_BLAST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.IBAN_BLAST), + SPELL_SNARE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SNARE), + SPELL_MAGIC_DART(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MAGIC_DART), + SPELL_ARDOUGNE_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ARDOUGNE_TELEPORT), + SPELL_EARTH_BLAST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EARTH_BLAST), + SPELL_HIGH_LEVEL_ALCHEMY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HIGH_LEVEL_ALCHEMY), + SPELL_CHARGE_WATER_ORB(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CHARGE_WATER_ORB), + SPELL_LVL_4_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_4_ENCHANT), + SPELL_WATCHTOWER_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATCHTOWER_TELEPORT), + SPELL_FIRE_BLAST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FIRE_BLAST), + SPELL_CHARGE_EARTH_ORB(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CHARGE_EARTH_ORB), + SPELL_BONES_TO_PEACHES(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BONES_TO_PEACHES), + SPELL_SARADOMIN_STRIKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SARADOMIN_STRIKE), + SPELL_CLAWS_OF_GUTHIX(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CLAWS_OF_GUTHIX), + SPELL_FLAMES_OF_ZAMORAK(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FLAMES_OF_ZAMORAK), + SPELL_TROLLHEIM_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TROLLHEIM_TELEPORT), + SPELL_WIND_WAVE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WIND_WAVE), + SPELL_CHARGE_FIRE_ORB(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CHARGE_FIRE_ORB), + SPELL_TELEPORT_TO_APE_ATOLL(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEPORT_TO_APE_ATOLL), + SPELL_WATER_WAVE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATER_WAVE), + SPELL_CHARGE_AIR_ORB(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CHARGE_AIR_ORB), + SPELL_VULNERABILITY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.VULNERABILITY), + SPELL_LVL_5_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_5_ENCHANT), + SPELL_TELEPORT_TO_KOUREND(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEPORT_TO_KOUREND), + SPELL_EARTH_WAVE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EARTH_WAVE), + SPELL_ENFEEBLE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ENFEEBLE), + SPELL_FIRE_WAVE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FIRE_WAVE), + SPELL_ENTANGLE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ENTANGLE), + SPELL_TELEOTHER_LUMBRIDGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEOTHER_LUMBRIDGE), + SPELL_STUN(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.STUN), + SPELL_CHARGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CHARGE), + SPELL_WIND_SURGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WIND_SURGE), + SPELL_TELEOTHER_FALADOR(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEOTHER_FALADOR), + SPELL_WATER_SURGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATER_SURGE), + SPELL_TELE_BLOCK(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_BLOCK), + SPELL_LVL_6_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_6_ENCHANT), + SPELL_TELEOTHER_CAMELOT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELEOTHER_CAMELOT), + SPELL_EARTH_SURGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EARTH_SURGE), + SPELL_LVL_7_ENCHANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LVL_7_ENCHANT), + SPELL_FIRE_SURGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FIRE_SURGE), + SPELL_BOUNTY_TARGET_TELEPORT2(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BOUNTY_TARGET_TELEPORT), + /* END OF STANDARD SPELL BOOK WIDGETS*/ + + /* ANCIENT SPELL BOOK WIDGETS*/ + SPELL_ICE_RUSH(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ICE_RUSH), + SPELL_ICE_BLITZ(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ICE_BLITZ), + SPELL_ICE_BURST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ICE_BURST), + SPELL_ICE_BARRAGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ICE_BARRAGE), + SPELL_BLOOD_RUSH(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BLOOD_RUSH), + SPELL_BLOOD_BLITZ(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BLOOD_BLITZ), + SPELL_BLOOD_BURST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BLOOD_BURST), + SPELL_BLOOD_BARRAGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BLOOD_BARRAGE), + SPELL_SMOKE_RUSH(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SMOKE_RUSH), + SPELL_SMOKE_BLITZ(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SMOKE_BLITZ), + SPELL_SMOKE_BURST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SMOKE_BURST), + SPELL_SMOKE_BARRAGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SMOKE_BARRAGE), + SPELL_SHADOW_RUSH(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SHADOW_RUSH), + SPELL_SHADOW_BLITZ(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SHADOW_BLITZ), + SPELL_SHADOW_BURST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SHADOW_BURST), + SPELL_SHADOW_BARRAGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SHADOW_BARRAGE), + SPELL_PADDEWWA_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.PADDEWWA_TELEPORT), + SPELL_SENNTISTEN_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SENNTISTEN_TELEPORT), + SPELL_KHARYRLL_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.KHARYRLL_TELEPORT), + SPELL_LASSAR_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LASSAR_TELEPORT), + SPELL_DAREEYAK_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DAREEYAK_TELEPORT), + SPELL_CARRALLANGER_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CARRALLANGER_TELEPORT), + SPELL_ANNAKARL_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ANNAKARL_TELEPORT), + SPELL_GHORROCK_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.GHORROCK_TELEPORT), + SPELL_BOUNTY_TARGET_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BOUNTY_TARGET_TELEPORT), + /* END OF ANCIENT SPELL BOOK WIDGETS*/ + + /* LUNAR SPELL BOOK WIDGETS*/ + SPELL_VENGEANCE_OTHER(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.VENGEANCE_OTHER), + SPELL_VENGEANCE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.VENGEANCE), + SPELL_BOUNTY_TARGET_TELEPORT3(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BOUNTY_TARGET_TELEPORT), + SPELL_BAKE_PIE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BAKE_PIE), + SPELL_CURE_PLANT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CURE_PLANT), + SPELL_MONSTER_EXAMINE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MONSTER_EXAMINE), + SPELL_NPC_CONTACT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.NPC_CONTACT), + SPELL_CURE_OTHER(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CURE_OTHER), + SPELL_HUMIDIFY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HUMIDIFY), + SPELL_MOONCLAN_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MOONCLAN_TELEPORT), + SPELL_TELE_GROUP_MOONCLAN(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_MOONCLAN), + SPELL_CURE_ME(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CURE_ME), + SPELL_HUNTER_KIT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HUNTER_KIT), + SPELL_WATERBIRTH_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WATERBIRTH_TELEPORT), + SPELL_TELE_GROUP_WATERBIRTH(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_WATERBIRTH), + SPELL_CURE_GROUP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CURE_GROUP), + SPELL_STAT_SPY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.STAT_SPY), + SPELL_BARBARIAN_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BARBARIAN_TELEPORT), + SPELL_TELE_GROUP_BARBARIAN(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_BARBARIAN), + SPELL_SUPERGLASS_MAKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SUPERGLASS_MAKE), + SPELL_TAN_LEATHER(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TAN_LEATHER), + SPELL_KHAZARD_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.KHAZARD_TELEPORT), + SPELL_TELE_GROUP_KHAZARD(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_KHAZARD), + SPELL_DREAM(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DREAM), + SPELL_STRING_JEWELLERY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.STRING_JEWELLERY), + SPELL_STAT_RESTORE_POT_SHARE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.STAT_RESTORE_POT_SHARE), + SPELL_MAGIC_IMBUE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MAGIC_IMBUE), + SPELL_FERTILE_SOIL(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FERTILE_SOIL), + SPELL_BOOST_POTION_SHARE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BOOST_POTION_SHARE), + SPELL_FISHING_GUILD_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FISHING_GUILD_TELEPORT), + SPELL_TELE_GROUP_FISHING_GUILD(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_FISHING_GUILD), + SPELL_PLANK_MAKE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.PLANK_MAKE), + SPELL_CATHERBY_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CATHERBY_TELEPORT), + SPELL_TELE_GROUP_CATHERBY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_CATHERBY), + SPELL_RECHARGE_DRAGONSTONE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RECHARGE_DRAGONSTONE), + SPELL_ICE_PLATEAU_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ICE_PLATEAU_TELEPORT), + SPELL_TELE_GROUP_ICE_PLATEAU(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TELE_GROUP_ICE_PLATEAU), + SPELL_ENERGY_TRANSFER(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ENERGY_TRANSFER), + SPELL_HEAL_OTHER(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HEAL_OTHER), + SPELL_HEAL_GROUP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HEAL_GROUP), + SPELL_SPELLBOOK_SWAP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SPELLBOOK_SWAP), + SPELL_GEOMANCY(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.GEOMANCY), + SPELL_SPIN_FLAX(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SPIN_FLAX), + SPELL_OURANIA_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.OURANIA_TELEPORT), + /* END OF LUNAR SPELL BOOK WIDGETS*/ + SPELL_TOOLTIP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.TOOLTIP), + /* ARCEUUS SPELL BOOK WIDGETS*/ + SPELL_BASIC_REANIMATION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BASIC_REANIMATION), + SPELL_ARCEUUS_LIBRARY_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ARCEUUS_LIBRARY_TELEPORT), + SPELL_ADEPT_REANIMATION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.ADEPT_REANIMATION), + SPELL_EXPERT_REANIMATION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.EXPERT_REANIMATION), + SPELL_MASTER_REANIMATION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MASTER_REANIMATION), + SPELL_DRAYNOR_MANOR_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DRAYNOR_MANOR_TELEPORT), + SPELL_MIND_ALTAR_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MIND_ALTAR_TELEPORT), + SPELL_RESPAWN_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESPAWN_TELEPORT), + SPELL_SALVE_GRAVEYARD_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SALVE_GRAVEYARD_TELEPORT), + SPELL_FENKENSTRAINS_CASTLE_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.FENKENSTRAINS_CASTLE_TELEPORT), + SPELL_WEST_ARDOUGNE_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WEST_ARDOUGNE_TELEPORT), + SPELL_HARMONY_ISLAND_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.HARMONY_ISLAND_TELEPORT), + SPELL_CEMETERY_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.CEMETERY_TELEPORT), + SPELL_RESURRECT_CROPS(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_CROPS), + SPELL_BARROWS_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BARROWS_TELEPORT), + SPELL_APE_ATOLL_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.APE_ATOLL_TELEPORT), + SPELL_BATTLEFRONT_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.BATTLEFRONT_TELEPORT), + SPELL_INFERIOR_DEMONBANE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.INFERIOR_DEMONBANE), + SPELL_SUPERIOR_DEMONBANE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SUPERIOR_DEMONBANE), + SPELL_DARK_DEMONBANE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DARK_DEMONBANE), + SPELL_MARK_OF_DARKNESS(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.MARK_OF_DARKNESS), + SPELL_GHOSTLY_GRASP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.GHOSTLY_GRASP), + SPELL_SKELETAL_GRASP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SKELETAL_GRASP), + SPELL_UNDEAD_GRASP(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.UNDEAD_GRASP), + SPELL_WARD_OF_ARCEUUS(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.WARD_OF_ARCEUUS), + SPELL_LESSER_CORRUPTION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.LESSER_CORRUPTION), + SPELL_GREATER_CORRUPTION(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.GREATER_CORRUPTION), + SPELL_DEMONIC_OFFERING(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DEMONIC_OFFERING), + SPELL_SINISTER_OFFERING(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SINISTER_OFFERING), + SPELL_DEGRIME(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DEGRIME), + SPELL_SHADOW_VEIL(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.SHADOW_VEIL), + SPELL_VILE_VIGOUR(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.VILE_VIGOUR), + SPELL_DARK_LURE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DARK_LURE), + SPELL_DEATH_CHARGE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.DEATH_CHARGE), + SPELL_RESURRECT_LESSER_GHOST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_LESSER_GHOST), + SPELL_RESURRECT_LESSER_SKELETON(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_LESSER_SKELETON), + SPELL_RESURRECT_LESSER_ZOMBIE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_LESSER_ZOMBIE), + SPELL_RESURRECT_SUPERIOR_GHOST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_SUPERIOR_GHOST), + SPELL_RESURRECT_SUPERIOR_SKELETON(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_SUPERIOR_SKELETON), + SPELL_RESURRECT_SUPERIOR_ZOMBIE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_SUPERIOR_ZOMBIE), + SPELL_RESURRECT_GREATER_GHOST(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_GREATER_GHOST), + SPELL_RESURRECT_GREATER_SKELETON(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_GREATER_SKELETON), + SPELL_RESURRECT_GREATER_ZOMBIE(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.SpellBook.RESURRECT_GREATER_ZOMBIE), + /* END OF ARCEUUS SPELL BOOK WIDGETS*/ + + MULTICOMBAT_RESIZEABLE(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewport.MULTICOMBAT_INDICATOR), + + MUSICTAB_INTERFACE(WidgetID.MUSICTAB_GROUP_ID, 1), + MUSICTAB_SONG_BOX(WidgetID.MUSICTAB_GROUP_ID, 2), + MUSICTAB_ALL_SONGS(WidgetID.MUSICTAB_GROUP_ID, 3), + MUSICTAB_SCROLLBAR(WidgetID.MUSICTAB_GROUP_ID, 4), + MUSICTAB_PLAYING(WidgetID.MUSICTAB_GROUP_ID, 5), + MUSICTAB_CURRENT_SONG_NAME(WidgetID.MUSICTAB_GROUP_ID, 6), + MUSICTAB_AUTO_BUTTON_LISTENER(WidgetID.MUSICTAB_GROUP_ID, 7), + MUSICTAB_AUTO_BUTTON(WidgetID.MUSICTAB_GROUP_ID, 8), + MUSICTAB_MANUAL_BUTTON_LISTENER(WidgetID.MUSICTAB_GROUP_ID, 9), + MUSICTAB_MANUAL_BUTTON(WidgetID.MUSICTAB_GROUP_ID, 10), + MUSICTAB_LOOP_BUTTON_LISTENER(WidgetID.MUSICTAB_GROUP_ID, 11), + MUSICTAB_LOOP_BUTTON(WidgetID.MUSICTAB_GROUP_ID, 12), + MUSICTAB_UNLOCKED_SONGS(WidgetID.MUSICTAB_GROUP_ID, 13), + + QUESTTAB_QUEST_TAB(WidgetID.QUESTTAB_GROUP_ID, WidgetID.QuestTab.QUEST_TAB), + + EQUIPMENT_MELEE_STRENGTH(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.MELEE_STRENGTH), + EQUIPMENT_RANGED_STRENGTH(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.RANGED_STRENGTH), + EQUIPMENT_MAGIC_DAMAGE(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.MAGIC_DAMAGE), + EQUIP_YOUR_CHARACTER(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.EQUIP_YOUR_CHARACTER), + TRADING_WITH(WidgetID.PLAYER_TRADE_SCREEN_GROUP_ID, WidgetID.TradeScreen.FIRST_TRADING_WITH), + SECOND_TRADING_WITH(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_TRADING_WITH), + SECOND_TRADING_WITH_ACCEPT_BUTTON(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_ACCEPT_FUNC), + SECOND_TRADING_WITH_ACCEPT_TEXT(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_ACCEPT_TEXT), + SECOND_TRADING_WITH_DECLINE_BUTTON(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_DECLINE_FUNC), + SECOND_TRADING_WITH_DECLINE_TEXT(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_DECLINE_TEXT), + SECOND_TRADING_WITH_MY_OFFER(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_MY_OFFER), + SECOND_TRADING_WITH_THEIR_OFFER(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_THEIR_OFFER), + SECOND_TRADING_WITH_MY_ITEMS(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_MY_ITEMS), + SECOND_TRADING_WITH_THEIR_ITEMS(WidgetID.PLAYER_TRADE_CONFIRM_GROUP_ID, WidgetID.TradeScreen.SECOND_THEIR_ITEMS), + ; + + private final int groupId; + private final int childId; + + WidgetInfoExtended(int groupId, int childId) { + this.groupId = groupId; + this.childId = childId; + } + + /** + * Gets the ID of the group-child pairing. + * + * @return the ID + */ + public int getId() { + return groupId << 16 | childId; + } + + /** + * Gets the group ID of the pair. + * + * @return the group ID + */ + public int getGroupId() { + return groupId; + } + + /** + * Gets the ID of the child in the group. + * + * @return the child ID + */ + public int getChildId() { + return childId; + } + + /** + * Gets the packed widget ID. + * + * @return the packed ID + */ + public int getPackedId() { + return groupId << 16 | childId; + } + + /** + * Utility method that converts an ID returned by {@link #getId()} back + * to its group ID. + * + * @param id passed group-child ID + * @return the group ID + */ + public static int TO_GROUP(int id) { + return id >>> 16; + } + + /** + * Utility method that converts an ID returned by {@link #getId()} back + * to its child ID. + * + * @param id passed group-child ID + * @return the child ID + */ + public static int TO_CHILD(int id) { + return id & 0xFFFF; + } + + /** + * Packs the group and child IDs into a single integer. + * + * @param groupId the group ID + * @param childId the child ID + * @return the packed ID + */ + public static int PACK(int groupId, int childId) { + return groupId << 16 | childId; + } + +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/pathfinding/GlobalCollisionMap.java b/src/main/java/ee/futur/baseapi/pathfinding/GlobalCollisionMap.java new file mode 100644 index 0000000..1f747ac --- /dev/null +++ b/src/main/java/ee/futur/baseapi/pathfinding/GlobalCollisionMap.java @@ -0,0 +1,104 @@ +package ee.futur.baseapi.pathfinding; + +import ee.futur.baseapi.BaseApiPlugin; +import net.runelite.api.coords.WorldPoint; +import org.roaringbitmap.RoaringBitmap; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.*; +import java.util.zip.GZIPInputStream; + +public class GlobalCollisionMap { + static RoaringBitmap bitmap = init(); + + static byte[] load() { + try { + InputStream is = GlobalCollisionMap.class.getResourceAsStream("map"); + return new GZIPInputStream(is).readAllBytes(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static RoaringBitmap init() { + RoaringBitmap bitmap = new RoaringBitmap(); + try { + bitmap.deserialize(ByteBuffer.wrap(load())); + bitmap.runOptimize(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return bitmap; + } + + public static boolean east(WorldPoint wp) { + return bitmap.contains(packed(wp) | (1 << 30)); + } + + public static boolean north(WorldPoint wp) { + return bitmap.contains(packed(wp)); + } + + public static boolean south(WorldPoint wp) { + return north(wp.dy(-1)); + } + + public static boolean west(WorldPoint wp) { + return east(wp.dx(-1)); + } + + public static int packed(int x, int y, int plane) { + return (x & 16383) | ((y & 16383) << 14) | (plane << 28); + } + + public static WorldPoint unpack(int packed) { + return new WorldPoint(packed & 16383, (packed >> 14) & 16383, packed >> 28); + } + + public static int packed(WorldPoint wp) { + return (wp.getX() & 16383) | ((wp.getY() & 16383) << 14) | (wp.getPlane() << 28); + } + + public static List findPath(WorldPoint p) { + long start = System.currentTimeMillis(); + WorldPoint starting = BaseApiPlugin.getClient().getLocalPlayer().getWorldLocation(); + HashSet visited = new HashSet<>(); + ArrayDeque queue = new ArrayDeque(); + queue.add(new Node(starting)); + while (!queue.isEmpty()) { + Node current = queue.poll(); + WorldPoint currentData = current.getData(); + if (currentData.equals(p)) { + List ret = new ArrayList<>(); + while (current != null) { + ret.add(current.getData()); + current = current.getPrevious(); + } + Collections.reverse(ret); + ret.remove(0); + System.out.println("Path took " + (System.currentTimeMillis() - start) + "ms"); + return ret; + } + //west + if (west(currentData) && visited.add(currentData.dx(-1))) { + queue.add(new Node(currentData.dx(-1), current)); + } + //east + if (east(currentData) && visited.add(currentData.dx(1))) { + queue.add(new Node(currentData.dx(1), current)); + } + //south + if (south(currentData) && visited.add(currentData.dy(-1))) { + queue.add(new Node(currentData.dy(-1), current)); + } + //north + if (north(currentData) && visited.add(currentData.dy(1))) { + queue.add(new Node(currentData.dy(1), current)); + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/pathfinding/Node.java b/src/main/java/ee/futur/baseapi/pathfinding/Node.java new file mode 100644 index 0000000..52cb647 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/pathfinding/Node.java @@ -0,0 +1,35 @@ +package ee.futur.baseapi.pathfinding; + +import net.runelite.api.coords.WorldPoint; + +public class Node { + WorldPoint data; + Node previous; + + public Node(WorldPoint data) { + this.data = data; + } + + Node() { + this.data = null; + this.previous = null; + } + + public Node(WorldPoint data, Node previous) { + this.data = data; + this.previous = previous; + } + + public WorldPoint getData() { + return data; + } + + public Node getPrevious() { + return previous; + } + + public void setNode(WorldPoint data, Node previous) { + this.data = data; + this.previous = previous; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/utils/WorldAreaUtility.java b/src/main/java/ee/futur/baseapi/utils/WorldAreaUtility.java new file mode 100644 index 0000000..0b416a8 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/utils/WorldAreaUtility.java @@ -0,0 +1,110 @@ +package ee.futur.baseapi.utils; + +import ee.futur.baseapi.nono.packets.utils.PacketReflection; +import net.runelite.api.*; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; + +import java.util.ArrayList; +import java.util.List; + +public class WorldAreaUtility { + public static List objectInteractableTiles(TileObject e) { + Point p; + int width = 1; + int height = 1; + if (e instanceof GameObject) { + GameObject gameObject = (GameObject) e; + width = gameObject.sizeX(); + height = gameObject.sizeY(); + p = gameObject.getSceneMinLocation(); + } else { + p = new Point(e.getLocalLocation().getSceneX(), e.getLocalLocation().getSceneY()); + } + LocalPoint objectMinLocation = new LocalPoint(p.getX(), p.getY()); + WorldPoint objectMinWorldPoint = WorldPoint.fromScene(PacketReflection.getClient(), objectMinLocation.getX(), objectMinLocation.getY(), e.getPlane()); + int xSW = objectMinWorldPoint.getX(); + int ySW = objectMinWorldPoint.getY(); + int xNE = xSW + width - 1; + int yNE = ySW + height - 1; + List surroundingTiles = new ArrayList<>(); + for (int x = xSW - 1; x <= xNE + 1; x++) { + for (int y = ySW - 1; y <= yNE + 1; y++) { + // Check if the tile is a corner + boolean isCorner = (x == xSW - 1 && y == ySW - 1) || (x == xNE + 1 && y == ySW - 1) || + (x == xSW - 1 && y == yNE + 1) || (x == xNE + 1 && y == yNE + 1); + + // Exclude tiles that are within the object or are corner tiles + if ((x >= xSW && x <= xNE && y >= ySW && y <= yNE) || isCorner) { + continue; + } + surroundingTiles.add(new WorldPoint(x, y, objectMinWorldPoint.getPlane())); + } + } + CollisionData[] collisionData = PacketReflection.getClient().getCollisionMaps(); + if (collisionData == null) { + return surroundingTiles; + } + + int[][] planeData = collisionData[PacketReflection.getClient().getPlane()].getFlags(); + + var iter = surroundingTiles.iterator(); + + while (iter.hasNext()) { + WorldPoint testPoint = iter.next(); + LocalPoint localScenePoint = LocalPoint.fromWorld(PacketReflection.getClient(), testPoint); + if (localScenePoint == null) { + continue; + } + + int flags = planeData[localScenePoint.getSceneX()][localScenePoint.getSceneY()]; + if ((flags & CollisionDataFlag.BLOCK_MOVEMENT_FULL) != 0) { + iter.remove(); + } + } + return surroundingTiles; + } + + public static List objectInteractableTiles(Actor e) { + int x = 1; + int y = 1; + if (e instanceof NPC) { + NPC gameObject = (NPC) e; + x = gameObject.getComposition().getSize(); + y = gameObject.getComposition().getSize(); + } + WorldPoint areaMinCornerWorldPoint = new WorldPoint(e.getWorldLocation().getX() - 1, e.getWorldLocation().getY() - 1, e.getWorldLocation().getPlane()); + List objectArea = e.getWorldArea().toWorldPointList(); + int sx = x + 2; + int sy = y + 2; + ArrayList grownArea = new ArrayList<>(new WorldArea(areaMinCornerWorldPoint, sx, sy).toWorldPointList()); + grownArea.remove(grownArea.size() - 1); + grownArea.remove((sx * sy) - sx); + grownArea.remove(sx - 1); + grownArea.remove(0); + grownArea.removeAll(objectArea); + + CollisionData[] collisionData = PacketReflection.getClient().getCollisionMaps(); + if (collisionData == null) { + return grownArea; + } + + int[][] planeData = collisionData[PacketReflection.getClient().getPlane()].getFlags(); + + for (int i = grownArea.size() - 1; i >= 0; i--) { + WorldPoint testPoint = grownArea.get(i); + LocalPoint localScenePoint = LocalPoint.fromWorld(PacketReflection.getClient(), testPoint); + if (localScenePoint == null) { + continue; + } + + int flags = planeData[localScenePoint.getSceneX()][localScenePoint.getSceneY()]; + if ((flags & CollisionDataFlag.BLOCK_MOVEMENT_FULL) != 0) { + grownArea.remove(testPoint); + } + } + + return grownArea; + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/baseapi/utils/WorldPointUtility.java b/src/main/java/ee/futur/baseapi/utils/WorldPointUtility.java new file mode 100644 index 0000000..2029b79 --- /dev/null +++ b/src/main/java/ee/futur/baseapi/utils/WorldPointUtility.java @@ -0,0 +1,23 @@ +package ee.futur.baseapi.utils; + +import net.runelite.api.coords.WorldPoint; + +public class WorldPointUtility { + public static boolean arePointsAdjacent(WorldPoint reference, WorldPoint target) { + int x1 = reference.getX(); + int x2 = target.getX(); + + int y1 = reference.getY(); + int y2 = target.getY(); + + if (x1 != x2 && y1 != y2) { + return false; + } + + if (x1 == x2 && Math.abs(y1 - y2) == 1) { + return true; + } + + return y1 == y2 && Math.abs(x1 - x2) == 1; + } +} \ No newline at end of file diff --git a/src/main/java/com/toofifty/easygiantsfoundry/BonusWidget.java b/src/main/java/ee/futur/easygiantsfoundry/BonusWidget.java similarity index 92% rename from src/main/java/com/toofifty/easygiantsfoundry/BonusWidget.java rename to src/main/java/ee/futur/easygiantsfoundry/BonusWidget.java index 306f2ed..6e65e18 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/BonusWidget.java +++ b/src/main/java/ee/futur/easygiantsfoundry/BonusWidget.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; import net.runelite.api.Client; import net.runelite.api.widgets.Widget; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryClientIDs.java b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryClientIDs.java similarity index 97% rename from src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryClientIDs.java rename to src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryClientIDs.java index 537ae7e..20c52e2 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryClientIDs.java +++ b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryClientIDs.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; public class EasyGiantsFoundryClientIDs { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryConfig.java similarity index 99% rename from src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java rename to src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryConfig.java index 83c84e2..29ff89a 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java +++ b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryConfig.java @@ -1,8 +1,8 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; import java.awt.Color; -import com.toofifty.easygiantsfoundry.enums.FontType; +import ee.futur.easygiantsfoundry.enums.FontType; import net.runelite.client.config.Alpha; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryHelper.java b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryHelper.java similarity index 97% rename from src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryHelper.java rename to src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryHelper.java index 7625abc..d2e66cd 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryHelper.java +++ b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryHelper.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Point; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryPlugin.java similarity index 98% rename from src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java rename to src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryPlugin.java index 4b8d60e..4fdd7dd 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java +++ b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryPlugin.java @@ -1,10 +1,10 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; import com.google.inject.Provides; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_GAME_STAGE; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_HEAT; -import com.toofifty.easygiantsfoundry.enums.Stage; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_GAME_STAGE; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryClientIDs.VARBIT_HEAT; +import ee.futur.easygiantsfoundry.enums.Stage; import javax.inject.Inject; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryState.java similarity index 93% rename from src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java rename to src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryState.java index 1a80774..6171f15 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/ee/futur/easygiantsfoundry/EasyGiantsFoundryState.java @@ -1,13 +1,13 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import static com.toofifty.easygiantsfoundry.MathUtil.max1; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.*; +import static ee.futur.easygiantsfoundry.MathUtil.max1; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryClientIDs.*; -import com.toofifty.easygiantsfoundry.enums.Heat; -import com.toofifty.easygiantsfoundry.enums.Stage; -import static com.toofifty.easygiantsfoundry.enums.Stage.GRINDSTONE; -import static com.toofifty.easygiantsfoundry.enums.Stage.POLISHING_WHEEL; -import static com.toofifty.easygiantsfoundry.enums.Stage.TRIP_HAMMER; +import ee.futur.easygiantsfoundry.enums.Heat; +import ee.futur.easygiantsfoundry.enums.Stage; +import static ee.futur.easygiantsfoundry.enums.Stage.GRINDSTONE; +import static ee.futur.easygiantsfoundry.enums.Stage.POLISHING_WHEEL; +import static ee.futur.easygiantsfoundry.enums.Stage.TRIP_HAMMER; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay2D.java b/src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay2D.java similarity index 98% rename from src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay2D.java rename to src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay2D.java index 3965e3b..05cfe00 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay2D.java +++ b/src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay2D.java @@ -1,8 +1,8 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import com.toofifty.easygiantsfoundry.enums.Heat; -import com.toofifty.easygiantsfoundry.enums.MetalBarType; -import com.toofifty.easygiantsfoundry.enums.Stage; +import ee.futur.easygiantsfoundry.enums.Heat; +import ee.futur.easygiantsfoundry.enums.MetalBarType; +import ee.futur.easygiantsfoundry.enums.Stage; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay3D.java similarity index 96% rename from src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java rename to src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay3D.java index e50afab..daff1b3 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/ee/futur/easygiantsfoundry/FoundryOverlay3D.java @@ -1,14 +1,14 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.*; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor; -import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.renderTextLocation; -import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_1_VARBIT; -import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT; -import com.toofifty.easygiantsfoundry.enums.CommissionType; -import com.toofifty.easygiantsfoundry.enums.FontType; -import com.toofifty.easygiantsfoundry.enums.Heat; -import com.toofifty.easygiantsfoundry.enums.Stage; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryClientIDs.*; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor; +import static ee.futur.easygiantsfoundry.EasyGiantsFoundryHelper.renderTextLocation; +import static ee.futur.easygiantsfoundry.MouldHelper.SWORD_TYPE_1_VARBIT; +import static ee.futur.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT; +import ee.futur.easygiantsfoundry.enums.CommissionType; +import ee.futur.easygiantsfoundry.enums.FontType; +import ee.futur.easygiantsfoundry.enums.Heat; +import ee.futur.easygiantsfoundry.enums.Stage; import java.awt.Color; import java.awt.Dimension; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/ee/futur/easygiantsfoundry/HeatActionSolver.java similarity index 98% rename from src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java rename to src/main/java/ee/futur/easygiantsfoundry/HeatActionSolver.java index b40a11a..b6ee506 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/ee/futur/easygiantsfoundry/HeatActionSolver.java @@ -1,9 +1,9 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; //import java.util.ArrayList; //import java.util.List; -import com.toofifty.easygiantsfoundry.enums.Stage; +import ee.futur.easygiantsfoundry.enums.Stage; import lombok.Value; /** diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/ee/futur/easygiantsfoundry/HeatActionStateMachine.java similarity index 99% rename from src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java rename to src/main/java/ee/futur/easygiantsfoundry/HeatActionStateMachine.java index ccf6204..a525565 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/ee/futur/easygiantsfoundry/HeatActionStateMachine.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; import lombok.Data; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HighlightStyle.java b/src/main/java/ee/futur/easygiantsfoundry/HighlightStyle.java similarity index 63% rename from src/main/java/com/toofifty/easygiantsfoundry/HighlightStyle.java rename to src/main/java/ee/futur/easygiantsfoundry/HighlightStyle.java index e1eaedd..ae91940 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HighlightStyle.java +++ b/src/main/java/ee/futur/easygiantsfoundry/HighlightStyle.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; public enum HighlightStyle { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/MathUtil.java b/src/main/java/ee/futur/easygiantsfoundry/MathUtil.java similarity index 70% rename from src/main/java/com/toofifty/easygiantsfoundry/MathUtil.java rename to src/main/java/ee/futur/easygiantsfoundry/MathUtil.java index e5dbb4c..8f13254 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/MathUtil.java +++ b/src/main/java/ee/futur/easygiantsfoundry/MathUtil.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; public class MathUtil { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/MetalBarCounter.java b/src/main/java/ee/futur/easygiantsfoundry/MetalBarCounter.java similarity index 95% rename from src/main/java/com/toofifty/easygiantsfoundry/MetalBarCounter.java rename to src/main/java/ee/futur/easygiantsfoundry/MetalBarCounter.java index 5b65ade..eb2f708 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/MetalBarCounter.java +++ b/src/main/java/ee/futur/easygiantsfoundry/MetalBarCounter.java @@ -1,7 +1,7 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import com.toofifty.easygiantsfoundry.enums.MetalBarSource; -import com.toofifty.easygiantsfoundry.enums.MetalBarType; +import ee.futur.easygiantsfoundry.enums.MetalBarSource; +import ee.futur.easygiantsfoundry.enums.MetalBarType; import lombok.Getter; import lombok.Value; import net.runelite.api.Item; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/MetalBarValues.java b/src/main/java/ee/futur/easygiantsfoundry/MetalBarValues.java similarity index 98% rename from src/main/java/com/toofifty/easygiantsfoundry/MetalBarValues.java rename to src/main/java/ee/futur/easygiantsfoundry/MetalBarValues.java index efcd5c8..c8dd6a0 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/MetalBarValues.java +++ b/src/main/java/ee/futur/easygiantsfoundry/MetalBarValues.java @@ -1,7 +1,7 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import com.toofifty.easygiantsfoundry.enums.MetalBarSource; -import com.toofifty.easygiantsfoundry.enums.MetalBarType; +import ee.futur.easygiantsfoundry.enums.MetalBarSource; +import ee.futur.easygiantsfoundry.enums.MetalBarType; import lombok.Value; import net.runelite.api.gameval.ItemID; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java b/src/main/java/ee/futur/easygiantsfoundry/MouldHelper.java similarity index 96% rename from src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java rename to src/main/java/ee/futur/easygiantsfoundry/MouldHelper.java index dad7e3e..21e5a7a 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/MouldHelper.java +++ b/src/main/java/ee/futur/easygiantsfoundry/MouldHelper.java @@ -1,7 +1,7 @@ -package com.toofifty.easygiantsfoundry; +package ee.futur.easygiantsfoundry; -import com.toofifty.easygiantsfoundry.enums.CommissionType; -import com.toofifty.easygiantsfoundry.enums.Mould; +import ee.futur.easygiantsfoundry.enums.CommissionType; +import ee.futur.easygiantsfoundry.enums.Mould; import java.util.LinkedHashMap; import java.util.Map; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/CommissionType.java b/src/main/java/ee/futur/easygiantsfoundry/enums/CommissionType.java similarity index 89% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/CommissionType.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/CommissionType.java index 613c9cf..0ec8b2f 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/CommissionType.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/CommissionType.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; public enum CommissionType { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/FontType.java b/src/main/java/ee/futur/easygiantsfoundry/enums/FontType.java similarity index 91% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/FontType.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/FontType.java index 16fd0ca..a2bb6d4 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/FontType.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/FontType.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/Heat.java b/src/main/java/ee/futur/easygiantsfoundry/enums/Heat.java similarity index 90% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/Heat.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/Heat.java index 6e4a026..a97c1f1 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/Heat.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/Heat.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; import java.awt.Color; diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarSource.java b/src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarSource.java similarity index 56% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarSource.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarSource.java index 4820ebf..96c422f 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarSource.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarSource.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; public enum MetalBarSource { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarType.java b/src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarType.java similarity index 64% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarType.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarType.java index 9bde3e4..4586692 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/MetalBarType.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/MetalBarType.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; public enum MetalBarType { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/Mould.java b/src/main/java/ee/futur/easygiantsfoundry/enums/Mould.java similarity index 95% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/Mould.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/Mould.java index e707d4b..7b9475d 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/Mould.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/Mould.java @@ -1,12 +1,12 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; import com.google.common.collect.ImmutableMap; import lombok.AllArgsConstructor; import java.util.Map; -import static com.toofifty.easygiantsfoundry.enums.CommissionType.*; -import static com.toofifty.easygiantsfoundry.enums.MouldType.*; +import static ee.futur.easygiantsfoundry.enums.CommissionType.*; +import static ee.futur.easygiantsfoundry.enums.MouldType.*; @AllArgsConstructor public enum Mould diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/MouldType.java b/src/main/java/ee/futur/easygiantsfoundry/enums/MouldType.java similarity index 51% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/MouldType.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/MouldType.java index 2074385..6ccc7c2 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/MouldType.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/MouldType.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; public enum MouldType { diff --git a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java b/src/main/java/ee/futur/easygiantsfoundry/enums/Stage.java similarity index 92% rename from src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java rename to src/main/java/ee/futur/easygiantsfoundry/enums/Stage.java index 72a194e..fbda19e 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/enums/Stage.java +++ b/src/main/java/ee/futur/easygiantsfoundry/enums/Stage.java @@ -1,4 +1,4 @@ -package com.toofifty.easygiantsfoundry.enums; +package ee.futur.easygiantsfoundry.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/ee/futur/gotr/AutoRiftsConfig.java b/src/main/java/ee/futur/gotr/AutoRiftsConfig.java new file mode 100644 index 0000000..359734d --- /dev/null +++ b/src/main/java/ee/futur/gotr/AutoRiftsConfig.java @@ -0,0 +1,277 @@ +package ee.futur.gotr; + +import net.runelite.client.config.*; + +@ConfigGroup("AutoRifts") +public interface AutoRiftsConfig extends Config { + @ConfigItem( + keyName = "Toggle", + name = "Toggle", + description = "", + position = 0 + ) + default Keybind toggle() { + return Keybind.NOT_SET; + } + + @ConfigSection( + name = "Auto Rifts Configuration", + description = "Configure your settings for the AutoRifts plugin", + position = 1, + closedByDefault = true + ) + String autoRiftsConfig = "autoRiftsConfig"; + + @ConfigItem( + keyName = "prioritizeBloodDeath", + name = "Always use blood/death altars", + description = "Will ignore point balance for these altars and always use them if available.", + position = 2, + section = autoRiftsConfig + ) + default boolean prioritizeBloodDeath() { + return true; + } + + @ConfigItem( + keyName = "dropRunes", + name = "Drop Runes", + description = "Drop Runes instead of depositing (kek uim)", + position = 3, + section = autoRiftsConfig + ) + default boolean dropRunes() { + return false; + } + + @ConfigItem( + keyName = "dropRunesFilter", + name = "Drop Runes Filter", + description = "If Drop Runes is not enabled and this has runes entered, the type of rune entered here will still get dropped, others will get deposited (ex: air, Mind, Body). Add runes with full name, air rune, mind rune , cosmic rune, etc... and split with comma ','", + position = 5, + section = autoRiftsConfig + ) + default String dropRunesFilter() { + return ""; + } + + @ConfigItem( + keyName = "usePouches", + name = "Use Essence Pouches?", + description = "Requires NPC Contact runes in Rune Pouch or Redwood lit Lantern", + position = 6, + section = autoRiftsConfig + ) + default boolean usePouches() { + return false; + } + + @ConfigItem( + keyName = "hasBook", + name = "Abyssal Book in bank? (IMPORTANT FOR NPC CONTACT)", + description = "IMPORTANT TO USE NPC CONTACT", + position = 7, + section = autoRiftsConfig + ) + default boolean hasBook() { + return true; + } + + @ConfigItem( + keyName = "startFrags", + name = "Starting Fragments (0 to wait for first portal)", + description = "How many fragments you should get before leaving the starting zone", + position = 8, + section = autoRiftsConfig + ) + default int startingFrags() { + return 0; + } + + @ConfigSection( + name = "Altar Ignore Configuration", + description = "", + position = 60, + closedByDefault = true + ) + String ignoreSection = "ignoreSection"; + + @ConfigItem( + keyName = "ignoreAir", + name = "Ignore Air Altar", + description = "", + position = 61, + section = ignoreSection + ) + default boolean ignoreAir() { + return false; + } + + @ConfigItem( + keyName = "ignoreMind", + name = "Ignore Mind Altar", + description = "", + position = 62, + section = ignoreSection + ) + default boolean ignoreMind() { + return false; + } + + @ConfigItem( + keyName = "ignoreWater", + name = "Ignore Water Altar", + description = "", + position = 63, + section = ignoreSection + ) + default boolean ignoreWater() { + return false; + } + + @ConfigItem( + keyName = "ignoreEarth", + name = "Ignore Earth Altar", + description = "", + position = 64, + section = ignoreSection + ) + default boolean ignoreEarth() { + return false; + } + + @ConfigItem( + keyName = "ignoreFire", + name = "Ignore Fire Altar", + description = "", + position = 65, + section = ignoreSection + ) + default boolean ignoreFire() { + return false; + } + + @ConfigItem( + keyName = "ignoreBody", + name = "Ignore Body Altar", + description = "", + position = 66, + section = ignoreSection + ) + default boolean ignoreBody() { + return false; + } + + @ConfigItem( + keyName = "ignoreCosmic", + name = "Ignore Cosmic Altar", + description = "", + position = 67, + section = ignoreSection + ) + default boolean ignoreCosmic() { + return false; + } + + @ConfigItem( + keyName = "ignoreChaos", + name = "Ignore Chaos Altar", + description = "", + position = 68, + section = ignoreSection + ) + default boolean ignoreChaos() { + return false; + } + + @ConfigItem( + keyName = "ignoreNature", + name = "Ignore Nature Altar", + description = "", + position = 69, + section = ignoreSection + ) + default boolean ignoreNature() { + return false; + } + + @ConfigItem( + keyName = "ignoreLaw", + name = "Ignore Law Altar", + description = "", + position = 70, + section = ignoreSection + ) + default boolean ignoreLaw() { + return false; + } + + @ConfigItem( + keyName = "ignoreDeath", + name = "Ignore Death Altar", + description = "", + position = 71, + section = ignoreSection + ) + default boolean ignoreDeath() { + return false; + } + + @ConfigItem( + keyName = "ignoreBlood", + name = "Ignore Blood Altar", + description = "", + position = 72, + section = ignoreSection + ) + default boolean ignoreBlood() { + return false; + } + + @ConfigSection( + name = "Game Tick Configuration", + description = "Configure how to handles game tick delays, 1 game tick equates to roughly 600ms", + position = 100, + closedByDefault = true + ) + String delayTickConfig = "delayTickConfig"; + + @Range( + max = 10 + ) + @ConfigItem( + keyName = "tickDelayMin", + name = "Game Tick Min", + description = "", + position = 101, + section = delayTickConfig + ) + default int tickDelayMin() { + return 1; + } + + @Range( + max = 10 + ) + @ConfigItem( + keyName = "tickDelayMax", + name = "Game Tick Max", + description = "", + position = 102, + section = delayTickConfig + ) + default int tickDelayMax() { + return 3; + } + + @ConfigItem( + keyName = "tickDelayEnabled", + name = "Tick delay", + description = "enables some tick delays", + position = 103, + section = delayTickConfig + ) + default boolean tickDelay() { + return false; + } +} diff --git a/src/main/java/ee/futur/gotr/AutoRiftsOverlay.java b/src/main/java/ee/futur/gotr/AutoRiftsOverlay.java new file mode 100644 index 0000000..180dd4c --- /dev/null +++ b/src/main/java/ee/futur/gotr/AutoRiftsOverlay.java @@ -0,0 +1,70 @@ +package ee.futur.gotr; + +import net.runelite.api.Client; +import net.runelite.client.ui.overlay.OverlayPanel; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; + +import javax.inject.Inject; +import java.awt.*; + +import static org.apache.commons.lang3.time.DurationFormatUtils.formatDuration; + +public class AutoRiftsOverlay extends OverlayPanel { + + private final Client client; + private final AutoRiftsPlugin plugin; + public String overlayState = ""; + + @Inject + private AutoRiftsOverlay(Client client, AutoRiftsPlugin plugin) { + this.client = client; + this.plugin = plugin; + setPosition(OverlayPosition.BOTTOM_LEFT); + } + + @Override + public Dimension render(Graphics2D graphics) { + String timeFormat = (plugin.runningDuration.toHours() < 1) ? "mm:ss" : "HH:mm:ss"; + panelComponent.getChildren().add(TitleComponent.builder() + .text("AutoRifts") + .color(plugin.started ? Color.GREEN : Color.RED) + .build()); + + if (plugin.started) { + panelComponent.getChildren().add(LineComponent.builder() + .left("Time running:") + .leftColor(Color.WHITE) + .right(formatDuration(plugin.runningDuration.toMillis(), timeFormat)) + .rightColor(Color.WHITE) + .build()); + panelComponent.getChildren().add(LineComponent.builder() + .left("Status:") + .leftColor(Color.WHITE) + .right(overlayState) + .rightColor(Color.WHITE) + .build()); + panelComponent.getChildren().add(LineComponent.builder() + .left("Game Started:") + .leftColor(Color.WHITE) + .right(String.valueOf(plugin.riftState.isGameStarted())) + .rightColor(Color.WHITE) + .build()); + panelComponent.getChildren().add(LineComponent.builder() + .left("Portal Spawned:") + .leftColor(Color.WHITE) + .right(String.valueOf(plugin.riftState.isPortalSpawned())) + .rightColor(Color.WHITE) + .build()); + panelComponent.getChildren().add(LineComponent.builder() + .left("First Portal Spawned:") + .leftColor(Color.WHITE) + .right(String.valueOf(plugin.riftState.hasFirstPortalSpawned)) + .rightColor(Color.WHITE) + .build()); + panelComponent.setPreferredSize(new Dimension(250, 250)); + } + return super.render(graphics); + } +} diff --git a/src/main/java/ee/futur/gotr/AutoRiftsPlugin.java b/src/main/java/ee/futur/gotr/AutoRiftsPlugin.java new file mode 100644 index 0000000..cd9b1a0 --- /dev/null +++ b/src/main/java/ee/futur/gotr/AutoRiftsPlugin.java @@ -0,0 +1,994 @@ +package ee.futur.gotr; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; +import com.google.inject.Provides; +import ee.futur.baseapi.collections.*; +import ee.futur.baseapi.collections.query.TileObjectQuery; +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.gotr.data.CellMapper; +import ee.futur.gotr.data.Constants; +import ee.futur.utils.InventoryUtil; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.*; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.input.KeyManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.HotkeyListener; +import org.apache.commons.lang3.RandomUtils; + +import java.time.Duration; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +@PluginDescriptor( + name = "[PP] GOTR Helper", + description = "Guardians of the Rift", + enabledByDefault = false, + tags = {"gotr", "helper", "k4rli"} +) +@Slf4j +public class AutoRiftsPlugin extends Plugin { + @Inject + private Client client; + @Inject + private AutoRiftsConfig config; + @Inject + private AutoRiftsOverlay overlay; + @Inject + private KeyManager keyManager; + @Inject + private OverlayManager overlayManager; + @Inject + private PouchManager pouchManager; + @Inject + public GOTRState riftState; + @Inject + private ClientThread clientThread; + + //@Inject + //private ReflectBreakHandler breakHandler; + + public Instant timer; + public Duration runningDuration = Duration.ZERO; + private static final Set MiningAnimationIDs = ImmutableSet.of(AnimationID.MINING_BRONZE_PICKAXE, AnimationID.MINING_IRON_PICKAXE, AnimationID.MINING_STEEL_PICKAXE, AnimationID.MINING_BLACK_PICKAXE, AnimationID.MINING_MITHRIL_PICKAXE, AnimationID.MINING_ADAMANT_PICKAXE, AnimationID.MINING_RUNE_PICKAXE, AnimationID.MINING_GILDED_PICKAXE, AnimationID.MINING_DRAGON_PICKAXE, AnimationID.MINING_DRAGON_PICKAXE_UPGRADED, AnimationID.MINING_DRAGON_PICKAXE_OR, AnimationID.MINING_DRAGON_PICKAXE_OR_TRAILBLAZER, AnimationID.MINING_INFERNAL_PICKAXE, AnimationID.MINING_3A_PICKAXE, AnimationID.MINING_CRYSTAL_PICKAXE, AnimationID.MINING_TRAILBLAZER_PICKAXE, AnimationID.MINING_TRAILBLAZER_PICKAXE_2, AnimationID.MINING_TRAILBLAZER_PICKAXE_3); + private final List RunePouchList = ImmutableList.of(ItemID.RUNE_POUCH, ItemID.DIVINE_RUNE_POUCH, ItemID.RUNE_POUCH_L, ItemID.DIVINE_RUNE_POUCH_L); + private final List RuneList = ImmutableList.of( + ItemID.AIR_RUNE, + ItemID.WATER_RUNE, + ItemID.EARTH_RUNE, + ItemID.FIRE_RUNE, + ItemID.MIND_RUNE, + ItemID.CHAOS_RUNE, + ItemID.DEATH_RUNE, + ItemID.BLOOD_RUNE, + ItemID.COSMIC_RUNE, + ItemID.NATURE_RUNE, + ItemID.LAW_RUNE, + ItemID.BODY_RUNE, + ItemID.SOUL_RUNE, + ItemID.ASTRAL_RUNE, + ItemID.MIST_RUNE, + ItemID.MUD_RUNE, + ItemID.DUST_RUNE, + ItemID.LAVA_RUNE, + ItemID.STEAM_RUNE, + ItemID.SMOKE_RUNE, + ItemID.WRATH_RUNE); + + private final List PickaxeIDs = ImmutableList.of(ItemID.BRONZE_PICKAXE, + ItemID.IRON_PICKAXE, + ItemID.STEEL_PICKAXE, + ItemID.BLACK_PICKAXE, + ItemID.MITHRIL_PICKAXE, + ItemID.ADAMANT_PICKAXE, + ItemID.RUNE_PICKAXE, + ItemID.GILDED_PICKAXE, + ItemID.DRAGON_PICKAXE, + ItemID.DRAGON_PICKAXE_OR, + ItemID.DRAGON_PICKAXE_OR_25376, + ItemID.DRAGON_PICKAXE_12797, + ItemID.INFERNAL_PICKAXE, + ItemID._3RD_AGE_PICKAXE, + ItemID.CRYSTAL_PICKAXE, + ItemID.CRYSTAL_PICKAXE_INACTIVE, + ItemID.INFERNAL_PICKAXE_OR); + private final List PoweredCellList = ImmutableList.of(ItemID.WEAK_CELL, ItemID.OVERCHARGED_CELL, ItemID.STRONG_CELL, ItemID.MEDIUM_CELL); + public boolean started = false; + public int timeout = 0; + private boolean startingRun = false; + private boolean needsMoreStartingFragments = false; + + private boolean canEnterBarrier = false; + + @Provides + private AutoRiftsConfig getConfig(ConfigManager configManager) { + return configManager.getConfig(AutoRiftsConfig.class); + } + + @Override + protected void startUp() throws Exception { + keyManager.registerKeyListener(toggle); + overlayManager.add(overlay); + timeout = 0; + timer = Instant.now(); + pouchManager.register(); + riftState.register(); + } + + @Override + protected void shutDown() throws Exception { + keyManager.unregisterKeyListener(toggle); + overlayManager.remove(overlay); + pouchManager.deregister(); + riftState.deregister(); + timeout = 0; + toggle(); + timer = Instant.now(); + } + + @Subscribe + private void onGameTick(GameTick event) { + if (timeout > 0) { + timeout--; + return; + } + if (client.getGameState() != GameState.LOGGED_IN || !started) { + return; + } + + if (Inventory.search().idInList(PickaxeIDs).first().isEmpty() && Equipment.search().idInList(PickaxeIDs).first().isEmpty()) { + addMessage("No pickaxe found"); + setStarted(false); + return; + } + + if (config.usePouches() && !hasDegradePrevention() && (!hasNPCContactRunes() || !isOnLunar())) { + addMessage("Must have a rune pouch with NPC contact runes or some form of prevention to use essence pouches"); + setStarted(false); + return; + } + + runningDuration = runningDuration.plus(Duration.between(timer, Instant.now())); + timer = Instant.now(); + + if (Inventory.full() + && config.usePouches() + && pouchManager.hasEmptyPouches() + && Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE) > 0 + && !riftState.isInAltar()) { + pouchManager.fillPouches(); + if (riftState.isInHugeMine()) { + mineHugeGuardians(); + } else { + craftEssence(); + } + return; + } + + AutoRiftsState state = getState(); + overlay.overlayState = state.toString(); + + if (BaseApiPlugin.isMoving()) { + //Attempt to put runes in pouch where possible + getInventoryRunes().ifPresent(widget -> { + Optional optPouch = getRunePouch(); + if (optPouch.isEmpty()) { + return; + } + + if (!canDepositRune(widget.getItemId())) { + return; + } + + Widget pouch = optPouch.get(); + //MousePackets.queueClickPacket(); + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetOnWidget(widget, pouch); + }); + + dropRunes(); + + //Handle moving to the altar differently (allow for re-tasking) + if (state != AutoRiftsState.ENTER_ALTAR) { + return; + } + } + + switch (state) { + case WAITING_FOR_GAME: + waitForGame(); + break; + case MOVE_TO_EAST_MINE: + case LEAVE_EAST_MINE: + climbLargeMine(); + break; + case ENTER_PORTAL: + enterPortal(); + break; + case LEAVE_ALTAR: + exitAltar(); + break; + case GET_CELLS: + getCells(); + break; + case CRAFT_ESSENCE: + craftEssence(); + break; + case REPAIR_POUCH: + repairPouch(); + break; + case POWER_GUARDIAN: + powerGuardian(); + break; + case MINE_HUGE_GUARDIANS: + mineHugeGuardians(); + break; + case MINE_LARGE_GUARDIANS: + mineLargeGuardians(); + break; + case MINE_REGULAR_GUARDIANS: + mineGameGuardians(); + break; + case CRAFTING_ESSENCE: + break; + case DEPOSIT_RUNES: + depositRunes(); + break; + case USE_CELL: + usePowerCell(); + break; + case CRAFT_RUNES: + craftRunes(); + break; + case ENTER_ALTAR: + enterRift(); + break; + case ENTER_GAME: + enterGame(); + break; + case GAME_BUSY: + gameBusy(); + break; + case BREAK: + // @TODO + break; + } + } + + private AutoRiftsState getState() { + if (config.startingFrags() > 0 && getFragmentCount() > config.startingFrags()) { + needsMoreStartingFragments = false; + } else if (config.startingFrags() == 0) { + needsMoreStartingFragments = true; + } + + if (!riftState.isGameStarted() && !riftState.isInAltar()) { + return AutoRiftsState.BREAK; + } + + if (riftState.isGameBusy()) { + return AutoRiftsState.GAME_BUSY; + } + + if (riftState.isOutsideBarrier()) { + return AutoRiftsState.ENTER_GAME; + } else { + canEnterBarrier = false; + } + + if (pouchManager.hasDegradedPouches()) { + return AutoRiftsState.REPAIR_POUCH; + } + + if (!riftState.isGameStarted()) { + return getPregameState(); + } + + if (!riftState.hasFirstPortalSpawned && needsMoreStartingFragments) { + return getPreFirstPortalState(); + } + + if (riftState.isGameEnding) { + return getGameEndingState(); + } + + //After the first portal has spawned, we should always be leaving the east mine + if (riftState.isInLargeMine()) { + return AutoRiftsState.LEAVE_EAST_MINE; + } + + //If we're in the huge mine, we should mine until inventory is full and then leave + if (riftState.isInHugeMine()) { + if (Inventory.full()) { + return AutoRiftsState.ENTER_PORTAL; + } + + if (isMining()) { + return AutoRiftsState.MINING; + } + + return AutoRiftsState.MINE_HUGE_GUARDIANS; + } + + if (riftState.isInAltar()) { + startingRun = false; + if (Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE) > 0 || pouchManager.hasFullPouch()) { + return AutoRiftsState.CRAFT_RUNES; + } + + return AutoRiftsState.LEAVE_ALTAR; + } + + //If we're here, were in the game area + if (riftState.isPortalSpawned() && (pouchManager.hasEmptyPouches() || Inventory.getEmptySlots() > 15)) { + return AutoRiftsState.ENTER_PORTAL; + } + + if (Inventory.full() || startingRun) { + startingRun = true; + if (hasPowerEssence()) { + return AutoRiftsState.POWER_GUARDIAN; + } + + if (hasPowerCell()) { + return AutoRiftsState.USE_CELL; + } + + return AutoRiftsState.ENTER_ALTAR; + } + + if (client.getLocalPlayer().getAnimation() == 9365) { + return AutoRiftsState.CRAFTING_ESSENCE; + } + + if (getCellCount() == 0) { + return AutoRiftsState.GET_CELLS; + } + + if (getInventoryRunes().isPresent() && !config.dropRunes() && getDroppableRunes().isEmpty()) { + return AutoRiftsState.DEPOSIT_RUNES; + } + + if (getFragmentCount() < neededFrags()) { + if (isMining()) { + return AutoRiftsState.MINING; + } + return AutoRiftsState.MINE_REGULAR_GUARDIANS; + } + + return AutoRiftsState.CRAFT_ESSENCE; + } + + private AutoRiftsState getGameEndingState() { + if (riftState.isInAltar()) { + if (pouchManager.getEssenceInPouches() > 0 || Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE) > 0) { + return AutoRiftsState.CRAFT_RUNES; + } + + return AutoRiftsState.LEAVE_ALTAR; + } + + if (riftState.isInHugeMine()) { + return AutoRiftsState.ENTER_PORTAL; + } + + if (hasPowerEssence()) { + return AutoRiftsState.POWER_GUARDIAN; + } + + if (hasPowerCell()) { + return AutoRiftsState.USE_CELL; + } + + int essence = pouchManager.getEssenceInPouches() + Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE); + + if (essence > 20) { + return AutoRiftsState.ENTER_ALTAR; + } + + if (getInventoryRunes().isPresent()) { + return AutoRiftsState.DEPOSIT_RUNES; + } + + return AutoRiftsState.CRAFT_ESSENCE; + } + + + private AutoRiftsState getPreFirstPortalState() { + //Safety + if (riftState.isInAltar()) { + return AutoRiftsState.LEAVE_ALTAR; + } + //We're starting the game in the portal area + if (riftState.isInHugeMine()) { + if (Inventory.full()) { + return AutoRiftsState.ENTER_PORTAL; + } + + if (isMining()) { + return AutoRiftsState.MINING; + } + + return AutoRiftsState.MINE_HUGE_GUARDIANS; + } + + if (riftState.isInLargeMine()) { + if (hasPowerCell()) { + Inventory.search().idInList(PoweredCellList).first().ifPresent(widget -> { + //InventoryInteraction.useItem(widget, "Drop"); + }); + } + if (isMining()) { + return AutoRiftsState.MINING; + } + + return AutoRiftsState.MINE_LARGE_GUARDIANS; + } + + //If we get here, we're probably walking to east from the portal. + //Make a quick stop at cells if we need too + if (getCellCount() < 10) { + return AutoRiftsState.GET_CELLS; + } + + return AutoRiftsState.MOVE_TO_EAST_MINE; + } + + private AutoRiftsState getPregameState() { + if (config.startingFrags() > 0) { + needsMoreStartingFragments = true; + } + + if (riftState.isInHugeMine()) { + return AutoRiftsState.ENTER_PORTAL; + } + if (riftState.isInLargeMine()) { + return AutoRiftsState.WAITING_FOR_GAME; + } + + if (riftState.isInAltar()) { + if (pouchManager.getEssenceInPouches() > 0 || Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE) > 0) { + return AutoRiftsState.CRAFT_RUNES; + } + return AutoRiftsState.LEAVE_ALTAR; + } + + if (getInventoryRunes().isPresent()) { + return AutoRiftsState.DEPOSIT_RUNES; + } + + if (getCellCount() < 10) { + return AutoRiftsState.GET_CELLS; + } + + return AutoRiftsState.MOVE_TO_EAST_MINE; + } + + private int getCellCount() { + return Inventory.search().withId(ItemID.UNCHARGED_CELL).first().map(Widget::getItemQuantity).orElse(0); + } + + private void waitForGame() { + if (client.getLocalPlayer().getWorldLocation().getX() == Constants.LARGE_MINE_X) { + if (tickDelay() % 2 == 0) { + //MousePackets.queueClickPacket(); + //MovementPackets.queueMovement(3639, 9500, false); + } else { + //MousePackets.queueClickPacket(); + //MovementPackets.queueMovement(3640, 9500, false); + } + } + } + + @Subscribe + private void onChatMessage(ChatMessage event) { + if (client.getGameState() != GameState.LOGGED_IN || !started) { + return; + } + + if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE) return; + + if (client.getGameState() != GameState.LOGGED_IN) { + return; + } + + if (event.getMessage().contains("5 seconds.")) { + int attempt = RandomUtils.nextInt(0, 10); + if (attempt > 7) { + activatePickSpecial(); + } + } + + if (event.getMessage().contains("3..")) { + int attempt = RandomUtils.nextInt(0, 5); + if (attempt > 2) { + activatePickSpecial(); + } + } + + if (event.getMessage().contains("2..")) { + activatePickSpecial(); + } + + if (event.getMessage().contains("already enough adventurers")) { + timeout = 3; + } + } + + private void activatePickSpecial() { + if (client.getVarpValue(VarPlayer.SPECIAL_ATTACK_PERCENT) == 1000) { + if (!Equipment.search().matchesWildCardNoCase("*Dragon pickaxe*").empty() || !Equipment.search().matchesWildCardNoCase("*infernal pickaxe*").empty()) { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetActionPacket(1, 38862885, -1, -1); + } + } + } + + private void climbLargeMine() { + if (BaseApiPlugin.isMoving()) { + return; + } + Optional tileObject = TileObjects.search().withAction("Climb").nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + + //TileObject rubble = tileObject.get(); + //TileObjectInteraction.interact(rubble, "Climb"); + timeout = tickDelay(); + } + + private void getCells() { + if (Inventory.full() && Inventory.getItemAmount(ItemID.UNCHARGED_CELL) == 0) { + Inventory.search().withId(ItemID.GUARDIAN_ESSENCE).first().ifPresent(widget -> { + //InventoryInteraction.useItem(widget, "Drop"); + }); + } + + if (BaseApiPlugin.isMoving()) { + return; + } + + TileObjects.search().withName("Uncharged cells").first().ifPresent(tileObject -> { + //TileObjectInteraction.interact(tileObject, "Take-10"); + timeout = tickDelay(); + }); + } + + private void craftEssence() { + if (riftState.isGameStarted()) { + Optional tileObject = TileObjects.search().nameContains(Constants.WORKBENCH).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + TileObject workbench = tileObject.get(); + //TileObjectInteraction.interact(workbench, "Work-at"); + timeout = tickDelay(); + } + } + + private void mineHugeGuardians() { + Optional tileObject = TileObjects.search().nameContains(Constants.HUGE_REMAINS).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + TileObject remains = tileObject.get(); + //TileObjectInteraction.interact(remains, "Mine"); + timeout = tickDelay(); + } + + private void mineLargeGuardians() { + if (Inventory.full() && Inventory.getItemAmount(ItemID.GUARDIAN_FRAGMENTS) == 0) { + Inventory.search().withId(ItemID.GUARDIAN_ESSENCE).first().ifPresent(widget -> { + //InventoryInteraction.useItem(widget, "Drop"); + }); + } + + Optional tileObject = TileObjects.search().nameContains(Constants.LARGE_REMAINS).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + if (client.getLocalPlayer().getAnimation() == -1) { + TileObject remains = tileObject.get(); + //TileObjectInteraction.interact(remains, "Mine"); + timeout = tickDelay(); + } + } + + private Optional getInventoryRunes() { + return Inventory.search().idInList(RuneList).first(); + } + + private void mineGameGuardians() { + Optional tileObject = nameContainsNoCase(Constants.GAME_PARTS).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + if (client.getLocalPlayer().getAnimation() == -1) { + TileObject remains = tileObject.get(); + //TileObjectInteraction.interact(remains, "Mine"); + timeout = tickDelay(); + } + } + + private void gameBusy() { + if (BaseApiPlugin.isMoving()) { + return; + } + + if (riftState.getElementalPoints() < 0 && riftState.getCatalyticPoints() < 0) { + TileObjects.search().withId(43695).first().ifPresent(tileObject -> { + //TileObjectInteraction.interact(tileObject, "Check"); + }); + timeout = tickDelay(); + return; + } + + if (RandomUtils.nextInt(0, 100) == 30) { + TileObjects.search().withId(Constants.BARRIER_BUSY_ID).first().ifPresent(tileObject -> { + // TileObjectInteraction.interact(tileObject, "Peek"); + }); + } + } + + private void enterGame() { + if (canEnterBarrier) { + //TileObjects.search().withName("Barrier").first().ifPresent(tileObject -> TileObjectInteraction.interact(tileObject, "Quick-pass")); + timeout = 1; + return; + } + + Optional dialog = Widgets.search().withId(15007475).hiddenState(false).first(); + if (dialog.isEmpty()) { + //TileObjects.search().withName("Barrier").first().ifPresent(tileObject -> TileObjectInteraction.interact(tileObject, "Quick-pass")); + return; + } + + String dialogText = dialog.get().getText(); + if (dialogText.contains("the rift is already being guarded")) { + timeout = 10; + clickContinue(); + return; + } + + if (dialogText.contains("the adventurers within are just finishing up.")) { + canEnterBarrier = true; + timeout = 1; + } + } + + private void clickContinue() { + Widgets.search().withTextContains("Click here to continue").first().ifPresent(widget -> { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueResumePause(widget.getId(), -1); + }); + } + + private void setStarted(boolean started) { + this.started = started; + riftState.setStarted(started); + pouchManager.setStarted(started); + if (started) { + timer = Instant.now(); + if (config.usePouches()) { + clientThread.invokeLater(() -> pouchManager.refreshPouches()); + } + + //breakHandler.startPlugin(this); + } else { + //breakHandler.stopPlugin(this); + } + } + + private final HotkeyListener toggle = new HotkeyListener(() -> config.toggle()) { + @Override + public void hotkeyPressed() { + toggle(); + } + }; + + public void toggle() { + if (client.getGameState() != GameState.LOGGED_IN) { + return; + } + setStarted(!started); + } + + private int tickDelay() { + return config.tickDelay() ? ThreadLocalRandom.current().nextInt(config.tickDelayMin(), config.tickDelayMax()) : 0; + } + + private boolean isMining() { + return MiningAnimationIDs.contains(client.getLocalPlayer().getAnimation()); + } + + private void addMessage(String message) { + client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", message, null); + } + + private boolean hasRuneAmount(int runeId, int amount) { + return (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE1) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT1) >= amount) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE2) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT2) >= amount) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE3) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT3) >= amount) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE4) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT4) >= amount); + } + + private boolean canDepositRune(int runeId) { + return (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE1) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT1) < 16000) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE2) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT2) < 16000) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE3) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT3) < 16000) + || (client.getVarbitValue(Varbits.RUNE_POUCH_RUNE4) == runeId + && client.getVarbitValue(Varbits.RUNE_POUCH_AMOUNT4) < 16000); + } + + private boolean isOnLunar() { + return client.getVarbitValue(4070) == 2; + } + + private boolean hasNPCContactRunes() { + return hasRuneAmount(1, 2) && hasRuneAmount(14, 1) && hasRuneAmount(9, 1); + } + + private boolean hasPowerEssence() { + return Inventory.getItemAmount(ItemID.CATALYTIC_GUARDIAN_STONE) > 0 || Inventory.getItemAmount(ItemID.ELEMENTAL_GUARDIAN_STONE) > 0; + } + + private boolean hasPowerCell() { + return Inventory.search().idInList(PoweredCellList).first().isPresent(); + } + + private void enterPortal() { + if (BaseApiPlugin.isMoving()) { + return; + } + Optional tileObject = nameContainsNoCase(Constants.PORTAL).filter(to -> to.getWorldLocation().getY() >= Constants.OUTSIDE_BARRIER_Y).nearestToPlayer(); + if (tileObject.isEmpty()) { + //MousePackets.queueClickPacket(); + //MovementPackets.queueMovement(new WorldPoint(3615, 9499, 0)); + return; + } + + TileObject portal = tileObject.get(); + //TileObjectInteraction.interact(portal, "Enter", "Exit", "Use"); + timeout = tickDelay(); + } + + private void exitAltar() { + lastAltar = null; + if (BaseApiPlugin.isMoving()) { + return; + } + Optional tileObject = TileObjects.search().nameContains(Constants.PORTAL).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + + TileObject portal = tileObject.get(); + //TileObjectInteraction.interact(portal, "Use"); + timeout = tickDelay(); + } + + private void powerGuardian() { + Optional npc = NPCs.search().nameContains(Constants.GREAT_GUARDIAN).nearestToPlayer(); + if (npc.isEmpty()) { + return; + } + + NPC guardian = npc.get(); + //NPCInteraction.interact(guardian, "Power-up"); + timeout = tickDelay(); + } + + private void repairPouch() { + if (!Widgets.search().withTextContains("What do you want?").hiddenState(false).empty() || !Widgets.search().withTextContains("Can you repair").hiddenState(false).empty()) { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueResumePause(15138821, -1); + //MousePackets.queueClickPacket(); + //WidgetPackets.queueResumePause(14352385, config.hasBook() ? 1 : 2); + //MousePackets.queueClickPacket(); + //WidgetPackets.queueResumePause(14221317, -1); + //MousePackets.queueClickPacket(); + BaseApiPlugin.invoke(-1, -1, 26, -1, -1, -1, "", "", -1, -1); + timeout = 0; + if (config.usePouches()) { + clientThread.invokeLater(() -> pouchManager.refreshPouches()); + } + } else { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetActionPacket(2, WidgetInfoExtended.SPELL_NPC_CONTACT.getPackedId(), -1, -1); + timeout = 15; + } + } + + private Optional getRunePouch() { + return Inventory.search().idInList(RunePouchList).first(); + } + + private void depositRunes() { + Optional tileObject = TileObjects.search().withAction("Deposit-runes").nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + + TileObject runeDeposit = tileObject.get(); + //TileObjectInteraction.interact(runeDeposit, "Deposit-runes"); + timeout = tickDelay(); + } + + private int neededFrags() { + return Inventory.getEmptySlots() + pouchManager.getAvailableSpace() + 5; + } + + private void usePowerCell() { + if (BaseApiPlugin.isMoving()) { + return; + } + + Optional optCell = Inventory.search().idInList(PoweredCellList).first(); + if (optCell.isEmpty()) { + return; + } + + Widget cell = optCell.get(); + TileObject nextAltar = riftState.getNextAltar(); + int cellTier = CellMapper.GetCellTier(cell.getItemId()); + List shieldCells = TileObjects.search().nameContains("cell tile").result(); + //Prioritize upgrading shield cells + for (TileObject c : shieldCells) { + if (CellMapper.GetShieldTier(c.getId()) < cellTier) { + log.info("Upgrading power cell at " + c.getWorldLocation()); + //TileObjectInteraction.interact(c, "Place-cell"); + timeout = tickDelay(); + return; + } + } + + if (nextAltar == null) { + Optional bestBarrier = NPCs.search() + .filter(x -> x.getId() <= 11425 && x.getId() >= 11418) + .result().stream().min(Comparator.comparingDouble(this::getBarrierHealth)); + + if (bestBarrier.isPresent()) { + Optional tile = TileObjects.search().nameContains("cell tile").nearestToPoint(bestBarrier.get().getWorldLocation()); + if (tile.isPresent()) { + //tile.ifPresent(tileObject -> TileObjectInteraction.interact(tileObject, "Place-cell")); + log.info("Placing power cell at " + tile.get().getWorldLocation() + " with no altar present"); + timeout = tickDelay(); + } + } + } else { + Optional damagedBarrier = NPCs.search().filter(x -> x.getId() <= 11425 && x.getId() >= 11418 && getBarrierHealth(x) <= 50).first(); + if (damagedBarrier.isPresent()) { + Optional tile = TileObjects.search().nameContains("cell tile").nearestToPoint(damagedBarrier.get().getWorldLocation()); + if (tile.isPresent()) { + log.info("Placing power cell at " + tile.get().getWorldLocation() + " to repair barrier"); + //TileObjectInteraction.interact(tile.get(), "Place-cell"); + timeout = tickDelay(); + return; + } + } + + Optional bestBarrier = NPCs.search() + .filter(x -> x.getId() <= 11425 && x.getId() >= 11418) + .result().stream().min(Comparator.comparingInt(x -> x.getWorldLocation().distanceTo(nextAltar.getWorldLocation()))); + + if (bestBarrier.isPresent()) { + Optional tile = TileObjects.search().nameContains("cell tile").nearestToPoint(bestBarrier.get().getWorldLocation()); + if (tile.isPresent()) { + log.info("Placing power cell at " + tile.get().getWorldLocation() + " nearest to next altar"); + //TileObjectInteraction.interact(tile.get(), "Place-cell"); + timeout = tickDelay(); + } + } + } + } + + private List getDroppableRunes() { + List runesToDrop = new ArrayList<>(); + String[] runeFilterConfig = config.dropRunesFilter().split(","); + for (String rune : runeFilterConfig) { + rune = rune.trim(); + Inventory.search().matchesWildCardNoCase(rune).first().ifPresent(runesToDrop::add); + } + return runesToDrop; + } + + private void dropRunes() { + if (!config.dropRunes() && config.dropRunesFilter().isEmpty()) { + return; + } + + if (config.dropRunes()) { + Optional itemWidget = InventoryUtil.nameContainsNoCase("rune").filter(item -> !item.getName().contains("pickaxe")).first(); + if (itemWidget.isEmpty()) { + return; + } + + Widget item = itemWidget.get(); + //InventoryInteraction.useItem(item, "Drop"); + } else { + for (Widget rune : getDroppableRunes()) { + // InventoryInteraction.useItem(rune, "Drop"); + } + } + } + + private double getBarrierHealth(NPC barrier) { + if (barrier.getHealthScale() == -1) { + return 100; + } + + return (double) barrier.getHealthRatio() / (double) barrier.getHealthScale() * 100; + } + + private void craftRunes() { + Optional tileObject = TileObjects.search().withAction(Constants.CRAFT_RUNES).nearestToPlayer(); + if (tileObject.isEmpty()) { + return; + } + if (pouchManager.getEssenceInPouches() > 0 && Inventory.getEmptySlots() > 0) { + pouchManager.emptyPouches(); + TileObject altar = tileObject.get(); + //TileObjectInteraction.interact(altar, Constants.CRAFT_RUNES); + timeout = tickDelay(); + return; + } + if (Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE) > 0) { + TileObject altar = tileObject.get(); + //TileObjectInteraction.interact(altar, Constants.CRAFT_RUNES); + timeout = tickDelay(); + } + } + + private TileObject lastAltar = null; + + private void enterRift() { + TileObject nextAltar = riftState.getNextAltar(); + if (nextAltar == null) { + return; + } + //This allows us to redirect to a new altar if the state switches + if (nextAltar == lastAltar && BaseApiPlugin.isMoving()) { + return; + } + + lastAltar = nextAltar; + //TileObjectInteraction.interact(nextAltar, "Enter"); + timeout = tickDelay(); + } + + public static TileObjectQuery nameContainsNoCase(String name) { + return TileObjects.search().filter(tileObject -> { + ObjectComposition comp = TileObjectQuery.getObjectComposition(tileObject); + if (comp == null) + return false; + return comp.getName().toLowerCase().contains(name.toLowerCase()); + }); + } + + private boolean hasDegradePrevention() { + return Equipment.search().withId(ItemID.ABYSSAL_LANTERN_REDWOOD_LOGS).first().isPresent() || Equipment.search().withId(ItemID.RUNECRAFT_CAPE).first().isPresent() || Equipment.search().withId(ItemID.RUNECRAFT_CAPET).first().isPresent(); + } + + private int getFragmentCount() { + Optional frags = Inventory.search().withId(ItemID.GUARDIAN_FRAGMENTS).first(); + return frags.map(Widget::getItemQuantity).orElse(0); + } +} diff --git a/src/main/java/ee/futur/gotr/AutoRiftsState.java b/src/main/java/ee/futur/gotr/AutoRiftsState.java new file mode 100644 index 0000000..1f16f1b --- /dev/null +++ b/src/main/java/ee/futur/gotr/AutoRiftsState.java @@ -0,0 +1,25 @@ +package ee.futur.gotr; + +public enum AutoRiftsState { + GET_CELLS, + MOVE_TO_EAST_MINE, + WAITING_FOR_GAME, + ENTER_PORTAL, + MINE_HUGE_GUARDIANS, + MINE_LARGE_GUARDIANS, + MINE_REGULAR_GUARDIANS, + REPAIR_POUCH, + CRAFTING_ESSENCE, + CRAFT_ESSENCE, + DEPOSIT_RUNES, + CRAFT_RUNES, + LEAVE_EAST_MINE, + LEAVE_ALTAR, + POWER_GUARDIAN, + USE_CELL, + ENTER_ALTAR, + MINING, + ENTER_GAME, + GAME_BUSY, + BREAK +} \ No newline at end of file diff --git a/src/main/java/ee/futur/gotr/GOTRState.java b/src/main/java/ee/futur/gotr/GOTRState.java new file mode 100644 index 0000000..b932039 --- /dev/null +++ b/src/main/java/ee/futur/gotr/GOTRState.java @@ -0,0 +1,442 @@ +package ee.futur.gotr; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; +import ee.futur.baseapi.collections.Inventory; +import ee.futur.baseapi.collections.TileObjects; +import ee.futur.baseapi.collections.Widgets; +import ee.futur.gotr.data.Constants; +import ee.futur.gotr.data.Utility; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.*; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.Widget; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.eventbus.Subscribe; + +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +public class GOTRState { + public static final int AIR_ALTAR = 43701; + public static final int WATER_ALTAR = 43702; + public static final int EARTH_ALTAR = 43703; + public static final int FIRE_ALTAR = 43704; + public static final int MIND_ALTAR = 43705; + public static final int CHAOS_ALTAR = 43706; + public static final int DEATH_ALTAR = 43707; + public static final int BLOOD_ALTAR = 43708; + public static final int BODY_ALTAR = 43709; + public static final int COSMIC_ALTAR = 43710; + public static final int NATURE_ALTAR = 43711; + public static final int LAW_ALTAR = 43712; + @Getter + private int elementalPoints = -1; + @Getter + private int catalyticPoints = -1; + @Getter + private boolean gameStarted; + @Setter + private boolean started; + public boolean hasFirstPortalSpawned = false; + @Inject + private Client client; + private final EventBus eventBus; + private final AutoRiftsConfig config; + private static final String CHECK_POINT_REGEX = "You have (\\d+) catalytic energy and (\\d+) elemental energy"; + private static final Pattern CHECK_POINT_PATTERN = Pattern.compile(CHECK_POINT_REGEX); + private static final String REWARD_POINT_REGEX = "Total elemental energy:[^>]+>([\\d,]+).*Total catalytic energy:[^>]+>([\\d,]+)."; + private static final Pattern REWARD_POINT_PATTERN = Pattern.compile(REWARD_POINT_REGEX); + private static final Pattern PERCENT_PATTERN = Pattern.compile("(\\d+)%"); + private Set accessibleAltars = new HashSet<>(); + private static final Set GOTR_REGIONS = ImmutableSet.of(14483, 14484); + private static final int PORTAL_WIDGET_ID = 48889884; + int timeout = 0; + int gameEndTimeout = 10; + public boolean isGameEnding = false; + + @Inject + public GOTRState(EventBus eventBus, AutoRiftsConfig config) { + eventBus.register(this); + this.eventBus = eventBus; + this.config = config; + } + + public void register() { + eventBus.register(this); + } + + public void deregister() { + eventBus.unregister(this); + } + + @Subscribe + private void onGameTick(GameTick event) { + if (client.getGameState() != GameState.LOGGED_IN || !started) { + return; + } + + if (timeout > 0) { + timeout--; + return; + } + + if (this.accessibleAltars.isEmpty()) { + this.accessibleAltars = Utility.getAccessibleAltars(client.getRealSkillLevel(Skill.RUNECRAFT), + Quest.LOST_CITY.getState(client), Quest.TROLL_STRONGHOLD.getState(client), + Quest.MOURNINGS_END_PART_II.getState(client), Quest.SINS_OF_THE_FATHER.getState(client)); + } + + Optional frags = Inventory.search().withId(ItemID.GUARDIAN_FRAGMENTS).first(); + + if (!hasFirstPortalSpawned && (isPortalSpawned() || getPower() > 15 || (frags.isPresent() && frags.get().getItemQuantity() >= 250))) { + hasFirstPortalSpawned = true; + } + + if (!gameStarted && isWidgetVisible()) { + gameStarted = true; + } + + if (!isInAltar() && !isWidgetVisible()) { + gameEndTimeout--; + if (gameEndTimeout == 0) { + log.info("Setting game to ended"); + gameStarted = false; + isGameEnding = false; + hasFirstPortalSpawned = false; + } + } else { + gameEndTimeout = 10; + } + } + + private int getPower() { + Optional pWidget = Widgets.search().withId(48889874).first(); + if (pWidget.isEmpty()) { + return 0; + } + + Matcher matcher = PERCENT_PATTERN.matcher(pWidget.get().getText()); + if (matcher.find()) { + return Integer.parseInt(matcher.group(1)); + } else { + return 0; + } + } + + @Subscribe + private void onChatMessage(ChatMessage event) { + if (client.getGameState() != GameState.LOGGED_IN || !started) { + return; + } + + if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE && event.getType() != ChatMessageType.MESBOX) { + return; + } + + if (client.getGameState() != GameState.LOGGED_IN) { + return; + } + + if (event.getMessage().contains(ee.futur.gotr.data.Constants.GAME_STARTED)) { + gameStarted = true; + } + + if (event.getType() == ChatMessageType.MESBOX) { + Matcher checkPointMatcher = CHECK_POINT_PATTERN.matcher(event.getMessage()); + if (checkPointMatcher.find()) { + catalyticPoints = Integer.parseInt(checkPointMatcher.group(1)); + elementalPoints = Integer.parseInt(checkPointMatcher.group(2)); + } + } + + if (event.getMessage().contains("successfully closed the rift")) { + gameStarted = false; + hasFirstPortalSpawned = false; + isGameEnding = false; + } + + if (event.getMessage().contains("Guardian was defeated")) { + gameStarted = false; + hasFirstPortalSpawned = false; + isGameEnding = false; + } + + if (event.getMessage().contains("is fully charged")) { + isGameEnding = true; + } + + Matcher rewardPointMatcher = REWARD_POINT_PATTERN.matcher(event.getMessage()); + if (rewardPointMatcher.find()) { + elementalPoints = Integer.parseInt(rewardPointMatcher.group(1).replaceAll(",", "")); + catalyticPoints = Integer.parseInt(rewardPointMatcher.group(2).replaceAll(",", "")); + } + } + + private boolean isWidgetVisible() { + Optional widget = Widgets.search().withId(ee.futur.gotr.data.Constants.PARENT_WIDGET).first(); + return widget.isPresent() && !widget.get().isHidden(); + } + + + public boolean isInAltar() { + for (int region : client.getMapRegions()) { + if (GOTR_REGIONS.contains(region)) { + return false; + } + } + return true; + } + + public boolean isOutsideBarrier() { + return client.getLocalPlayer().getWorldLocation().getY() <= ee.futur.gotr.data.Constants.OUTSIDE_BARRIER_Y && !isInAltar(); + } + + public boolean isInLargeMine() { + return !isInAltar() && client.getLocalPlayer().getWorldLocation().getX() >= ee.futur.gotr.data.Constants.LARGE_MINE_X; + } + + public boolean isInHugeMine() { + return !isInAltar() && client.getLocalPlayer().getWorldLocation().getX() <= ee.futur.gotr.data.Constants.HUGE_MINE_X; + } + + public boolean isGameBusy() { + return !isInAltar() && isOutsideBarrier() && TileObjects.search().withId(Constants.BARRIER_BUSY_ID).nearestToPlayer().isPresent(); + } + + public boolean isPortalSpawned() { + Widget portalWidget = client.getWidget(PORTAL_WIDGET_ID); + return portalWidget != null && !portalWidget.isHidden(); + } + + public TileObject getNextAltar() { + int catalytic; + int elemental; + TileObject catalyticAltar = null; + TileObject elementalAltar = null; + List guardians = TileObjects.search().nameContains("Guardian of").result(); + for (TileObject guardian : guardians) { + GameObject gameObject = (GameObject) guardian; + Animation animation = ((DynamicObject) gameObject.getRenderable()).getAnimation(); + //Active guardians + if (animation.getId() == 9363) { + if (isCatalytic(guardian)) { + if (accessibleAltars.contains(guardian.getId()) && isAltarBetter(catalyticAltar, guardian)) { + catalyticAltar = guardian; + } + } else if (isAltarBetter(elementalAltar, guardian)) { + elementalAltar = guardian; + } + } else { + if (!hasTalisman(guardian)) { + continue; + } + + if (isCatalytic(guardian)) { + if (accessibleAltars.contains(guardian.getId()) && isAltarBetter(catalyticAltar, guardian)) { + catalyticAltar = guardian; + } + } else { + if (isAltarBetter(elementalAltar, guardian)) { + elementalAltar = guardian; + } + } + } + } + + if (catalyticPoints < 0 && elementalPoints < 0) { + elemental = client.getVarbitValue(13686); + catalytic = client.getVarbitValue(13685); + } else { + elemental = elementalPoints; + catalytic = catalyticPoints; + elemental += (int) Math.floor((double) client.getVarbitValue(13686) / 100); + catalytic += (int) Math.floor((double) client.getVarbitValue(13685) / 100); + } + + //log.info("Catalytic: " + catalytic + " Elemental: " + elemental); + + if (catalytic == 0 && elemental == 0) { + elemental = 1; + } + + Widget catalyticWidget = client.getWidget(48889879); + Widget elementalWidget = client.getWidget(48889876); + + if (elementalWidget == null || catalyticWidget == null) { + return null; + } + + if (catalyticAltar == null) { + return elementalAltar; + } + + if (elementalAltar == null) { + return catalyticAltar; + } + + if (config.prioritizeBloodDeath() && isBloodDeath(catalyticAltar)) { + return catalyticAltar; + } + + if (isAltarIgnored(catalyticAltar)) { + if (isAltarIgnored(elementalAltar)) { + if (catalytic > elemental) { + return elementalAltar; + } else { + return catalyticAltar; + } + } + + return elementalAltar; + } + + if (isAltarIgnored(elementalAltar)) { + return catalyticAltar; + } + + if (catalytic > elemental) { + return elementalAltar; + } + + return catalyticAltar; + } + + private boolean isBloodDeath(TileObject altar) { + switch (altar.getId()) { + case BLOOD_ALTAR: + case DEATH_ALTAR: + return true; + default: + return false; + } + } + + private boolean isAltarBetter(TileObject oldAltar, TileObject candidate) { + if (oldAltar == null) { + return true; + } + + if (getAltarPriority(oldAltar) < getAltarPriority(candidate)) { + return true; + } + + if (getAltarPriority(oldAltar) == getAltarPriority(candidate) && hasTalisman(candidate)) { + return true; + } + + return false; + } + + private boolean isAltarIgnored(TileObject altar) { + switch (altar.getId()) { + case AIR_ALTAR: + return config.ignoreAir(); + case MIND_ALTAR: + return config.ignoreMind(); + case BODY_ALTAR: + return config.ignoreBody(); + case WATER_ALTAR: + return config.ignoreWater(); + case COSMIC_ALTAR: + return config.ignoreCosmic(); + case CHAOS_ALTAR: + return config.ignoreChaos(); + case EARTH_ALTAR: + return config.ignoreEarth(); + case NATURE_ALTAR: + return config.ignoreNature(); + case LAW_ALTAR: + return config.ignoreLaw(); + case FIRE_ALTAR: + return config.ignoreFire(); + case DEATH_ALTAR: + return config.ignoreDeath(); + case BLOOD_ALTAR: + return config.ignoreBlood(); + } + + return false; + } + + private int getAltarPriority(TileObject altar) { + switch (altar.getId()) { + case AIR_ALTAR: + case MIND_ALTAR: + case BODY_ALTAR: + return 1; + case WATER_ALTAR: + case COSMIC_ALTAR: + case CHAOS_ALTAR: + return 2; + case EARTH_ALTAR: + case NATURE_ALTAR: + case LAW_ALTAR: + return 3; + case FIRE_ALTAR: + case DEATH_ALTAR: + return 4; + case BLOOD_ALTAR: + return 5; + } + + return -1; + } + + private boolean hasTalisman(TileObject altar) { + int talismanID = 0; + switch (altar.getId()) { + case AIR_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_AIR; + break; + case WATER_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_WATER; + break; + case EARTH_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_EARTH; + break; + case FIRE_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_FIRE; + break; + case MIND_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_MIND; + break; + case CHAOS_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_CHAOS; + break; + case DEATH_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_DEATH; + break; + case BLOOD_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_BLOOD; + break; + case BODY_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_BODY; + break; + case COSMIC_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_COSMIC; + break; + case NATURE_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_NATURE; + break; + case LAW_ALTAR: + talismanID = ItemID.PORTAL_TALISMAN_LAW; + break; + } + + return Inventory.getItemAmount(talismanID) > 0; + } + + private boolean isCatalytic(TileObject altar) { + Set catalyticAltars = Set.of(43705, 43709, 43706, 43710, 43711, 43708, 43712, 43707); + return catalyticAltars.contains(altar.getId()); + } +} diff --git a/src/main/java/ee/futur/gotr/PouchManager.java b/src/main/java/ee/futur/gotr/PouchManager.java new file mode 100644 index 0000000..24b251c --- /dev/null +++ b/src/main/java/ee/futur/gotr/PouchManager.java @@ -0,0 +1,214 @@ +package ee.futur.gotr; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import ee.futur.baseapi.collections.Inventory; +import ee.futur.gotr.data.Constants; +import ee.futur.gotr.data.Pouch; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.*; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.widgets.Widget; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Slf4j +@Singleton +public class PouchManager { + private final List pouches = new ArrayList<>(); + @Inject + private Client client; + private final EventBus eventBus; + @Setter + private boolean started; + private final List DEGRADED_POUCH_IDS = ImmutableList.of(ItemID.MEDIUM_POUCH_5511, ItemID.LARGE_POUCH_5513, ItemID.GIANT_POUCH_5515, + ItemID.COLOSSAL_POUCH_26786); + + @Inject + public PouchManager(EventBus eventBus) { + this.eventBus = eventBus; + } + + public void register() { + eventBus.register(this); + } + + public void deregister() { + eventBus.unregister(this); + } + + public void refreshPouches() { + //pouches.clear(); + Optional smallpouch = Inventory.search().withId(ItemID.SMALL_POUCH).first(); + Optional medpouch = Inventory.search().withId(ItemID.MEDIUM_POUCH).first(); + Optional largepouch = Inventory.search().withId(ItemID.LARGE_POUCH).first(); + Optional giantpouch = Inventory.search().withId(ItemID.GIANT_POUCH).first(); + Optional collosalpouch = Inventory.search().withId(ItemID.COLOSSAL_POUCH).first(); + if (smallpouch.isPresent()) { + Pouch smallEssPouch = new Pouch(ItemID.SMALL_POUCH, 3); + pouches.removeIf(p -> p.getPouchID() == ItemID.SMALL_POUCH); + pouches.add(smallEssPouch); + } + + if (medpouch.isPresent() && client.getRealSkillLevel(Skill.RUNECRAFT) >= 25) { + Pouch medEssPouch = new Pouch(ItemID.MEDIUM_POUCH, 6); + pouches.removeIf(p -> p.getPouchID() == ItemID.MEDIUM_POUCH); + pouches.add(medEssPouch); + } + + if (largepouch.isPresent() && client.getRealSkillLevel(Skill.RUNECRAFT) >= 50) { + Pouch largeEssPouch = new Pouch(ItemID.LARGE_POUCH, 9); + pouches.removeIf(p -> p.getPouchID() == ItemID.LARGE_POUCH); + pouches.add(largeEssPouch); + } + + if (giantpouch.isPresent() && client.getRealSkillLevel(Skill.RUNECRAFT) >= 75) { + Pouch giantEssPouch = new Pouch(ItemID.GIANT_POUCH, 12); + pouches.removeIf(p -> p.getPouchID() == ItemID.GIANT_POUCH); + pouches.add(giantEssPouch); + } + + if (collosalpouch.isPresent() && client.getRealSkillLevel(Skill.RUNECRAFT) >= 85) { + Pouch colossalEssPouch = new Pouch(ItemID.COLOSSAL_POUCH, 40); + pouches.removeIf(p -> p.getPouchID() == ItemID.COLOSSAL_POUCH); + pouches.add(colossalEssPouch); + } + + log.info("Setting Pouches: " + pouches); + } + + + @Subscribe + private void onChatMessage(ChatMessage event) { + //log.info(pouches.toString()); + if (client.getGameState() != GameState.LOGGED_IN || !started) { + return; + } + + if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE) return; + + if (client.getGameState() != GameState.LOGGED_IN) { + return; + } + + if (event.getMessage().contains(ee.futur.gotr.data.Constants.GAME_STARTED)) { + setEssenceInPouches(0); + } + + if (event.getMessage().contains(ee.futur.gotr.data.Constants.GAME_WIN)) { + setEssenceInPouches(0); + } + + if (event.getMessage().contains(Constants.GAME_OVER)) { + setEssenceInPouches(0); + } + } + + public List getFullPouches() { + List result = new ArrayList<>(); + for (Pouch pouch : pouches) { + if (pouch.getCurrentEssence() > 0) { + result.add(pouch); + } + } + return result; + } + + public boolean hasFullPouch() { + for (Pouch pouch : pouches) { + if (pouch.getCurrentEssence() > 0) { + return true; + } + } + return false; + } + + public void fillPouches() { + int essenceAmount = Inventory.getItemAmount(ItemID.GUARDIAN_ESSENCE); + List result = getEmptyPouches(); + for (Pouch pouch : result) { + Optional emptyPouch = Inventory.search().withId(pouch.getPouchID()).first(); + if (emptyPouch.isPresent()) { + Widget p = emptyPouch.get(); + //InventoryInteraction.useItem(p, "Fill"); + int essenceWithdrawn = pouch.getEssenceTotal() - pouch.getCurrentEssence(); + if (essenceAmount - essenceWithdrawn >= 0) { + essenceAmount -= essenceWithdrawn; + pouch.setCurrentEssence(pouch.getEssenceTotal()); + } else { + pouch.setCurrentEssence(pouch.getCurrentEssence() + essenceAmount); + essenceAmount = 0; + } + if (essenceAmount == 0) { + + break; + } + } + } + } + + public void emptyPouches() { + int spaces = Inventory.getEmptySlots(); + List result = getFullPouches(); + for (Pouch pouch : result) { + Optional emptyPouch = Inventory.search().withId(pouch.getPouchID()).first(); + if (emptyPouch.isPresent()) { + //InventoryInteraction.useItem(emptyPouch.get(), "Empty"); + if (pouch.getCurrentEssence() - spaces < 0) { + spaces -= pouch.getCurrentEssence(); + pouch.setCurrentEssence(0); + } else { + pouch.setCurrentEssence(pouch.getCurrentEssence() - spaces); + break; + } + } + } + } + + public List getEmptyPouches() { + List result = new ArrayList<>(); + for (Pouch pouch : pouches) { + if (!isPouchFull(pouch)) { + result.add(pouch); + } + } + return result; + } + + public boolean hasEmptyPouches() { + for (Pouch pouch : pouches) { + if (!isPouchFull(pouch)) { + return true; + } + } + return false; + } + + private boolean isPouchFull(Pouch pouch) { + return pouch.getCurrentEssence() == pouch.getEssenceTotal(); + } + + private void setEssenceInPouches(int amount) { + for (Pouch curr : pouches) { + curr.setCurrentEssence(amount); + } + } + + public boolean hasDegradedPouches() { + return Inventory.search().idInList(DEGRADED_POUCH_IDS).first().isPresent(); + } + + public int getAvailableSpace() { + return pouches.stream().mapToInt(pouch -> pouch.getEssenceTotal() - pouch.getCurrentEssence()).sum(); + } + + public int getEssenceInPouches() { + return pouches.stream().mapToInt(Pouch::getCurrentEssence).sum(); + } +} diff --git a/src/main/java/ee/futur/gotr/README.md b/src/main/java/ee/futur/gotr/README.md new file mode 100644 index 0000000..d12fa8d --- /dev/null +++ b/src/main/java/ee/futur/gotr/README.md @@ -0,0 +1,32 @@ +AutoRifts + +Automation plugins for runelite + +# Discord +https://discord.gg/kwYBYEg4uu + +# [PP]AutoRifts + +**How to setup**: + +- Starting Fragments + - How many fragments to mine before leaving the starting area +- Minimum Fragments + - Amount in inventory to start mining more fragments +- Ignore Portal Ess + - Ignores the portal if you have at least this many essence in inventory +- Drop Runes + - Check to drop all runes instead of depositing +- Drop Runes Filter + - Comma delimited, rune names to drop - the rest will be deposited +- Use Essence Pouches? + - Requires NPC Contact runes or redwood lit lantern +- Abyssal Book in bank? (IMPORTANT FOR NPC CONTACT) + - Check if you have the abyssal book in the bank + - This is required because owning the abyssal book changes the dialogue option +- Prioritize Catalytic Energy + - Will try to balance points if not checked +- Prioritize Higher Tier Runes (BETA) + - Prioritizes Nature/Law/Death/Blood runes even if points aren't balanced - Expect some bugs +- Prioritize Portal (BETA) + - Prioritizes the portal, mainly affects when to drop/deposit runes - Expect some bugs \ No newline at end of file diff --git a/src/main/java/ee/futur/gotr/data/Altar.java b/src/main/java/ee/futur/gotr/data/Altar.java new file mode 100644 index 0000000..feaa3e7 --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/Altar.java @@ -0,0 +1,45 @@ +package ee.futur.gotr.data; + +import lombok.Getter; + +@Getter +public enum Altar { + AIR(43701, Constants.AIR_SPRITE), + MIND(43705, Constants.MIND_SPRITE), + WATER(43702, Constants.WATER_SPRITE), + EARTH(43703, Constants.EARTH_SPRITE), + FIRE(43704, Constants.FIRE_SPRITE), + BODY(43709, Constants.BODY_SPRITE), + COSMIC(43710, Constants.COSMIC_SPRITE), + CHAOS(43706, Constants.CHAOS_SPRITE), + NATURE(43711, Constants.NATURE_SPRITE), + LAW(43712, Constants.LAW_SPRITE), + DEATH(43707, Constants.DEATH_SPRITE), + BLOOD(43708, Constants.BLOOD_SPRITE); + + final int id; + final int spriteId; + + Altar(int id, int spriteId) { + this.id = id; + this.spriteId = spriteId; + } + + public static Altar getAltarBySpriteId(int spriteId) { + for (Altar altar : Altar.values()) { + if (altar.getSpriteId() == spriteId) { + return altar; + } + } + return null; + } + + public static Altar getAltarByObjectId(int id) { + for (Altar altar : Altar.values()) { + if (altar.getId() == id) { + return altar; + } + } + return null; + } +} diff --git a/src/main/java/ee/futur/gotr/data/CellMapper.java b/src/main/java/ee/futur/gotr/data/CellMapper.java new file mode 100644 index 0000000..99c5b9a --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/CellMapper.java @@ -0,0 +1,38 @@ +package ee.futur.gotr.data; + +import net.runelite.api.ItemID; +import net.runelite.api.ObjectID; + +public class CellMapper { + public static int GetCellTier(int cellID) { + switch (cellID) { + case ItemID.WEAK_CELL: + return 1; + case ItemID.MEDIUM_CELL: + return 2; + case ItemID.STRONG_CELL: + return 3; + case ItemID.OVERCHARGED_CELL: + return 4; + default: + return -1; + } + } + + public static int GetShieldTier(int shieldID) { + switch (shieldID) { + case ObjectID.INACTIVE_CELL_TILE: + return 0; + case ObjectID.WEAK_CELL_TILE: + return 1; + case ObjectID.MEDIUM_CELL_TILE: + return 2; + case ObjectID.STRONG_CELL_TILE: + return 3; + case ObjectID.OVERPOWERED_CELL_TILE: + return 4; + default: + return -1; + } + } +} diff --git a/src/main/java/ee/futur/gotr/data/Constants.java b/src/main/java/ee/futur/gotr/data/Constants.java new file mode 100644 index 0000000..7327638 --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/Constants.java @@ -0,0 +1,74 @@ +package ee.futur.gotr.data; + +public class Constants { + //Locations + public static final int OUTSIDE_BARRIER_Y = 9482; + public static final int LARGE_MINE_X = 3637; + public static final int HUGE_MINE_X = 3592; + + // Game Object IDs + public static final int BARRIER_BUSY_ID = 43849; + public static final int BARRIER_READY_ID = 43700; + + public static final int ACTIVE_ALTAR = 9363; + + // Widget IDs + public static final int PARENT_WIDGET = 48889857; + public static final int WIDGET_POWER_PC = 48889874; + public static final int MAIN_TIMER = 48889861; + public static final int ELEMENTAL_ENERGY_COUNTER = 48889878; + public static final int CATALYTIC_ENERGY_COUNTER = 48889878; + public static final int GUARDIANS_ALIVE_COUNTER = 48889881; + public static final int PORTAL_TIMER = 48889884; + + public static final int WAITING_CATALYTIC_INDICATOR_SPRITE = 4355; + + + // Widget Text + private static final String OUTSIDE_GUARDED = "It looks like the rift is already being guarded. You must wait until they are done to join."; + private static final String GREAT_GUARDIAN_POWER = "Great Guardian power: "; + + + // Chat text + public static final String ENTER_ALTAR = "You step through the rift"; + public static final String EXIT_ALTAR = "You step through the portal and find yourself back in the temple."; + public static final String GAME_STARTED = "Creatures from the Abyss will attack in 120 seconds."; + public static final String ATTACK_STARTED = "Creatures from the Abyss begin their attack!"; + public static final String GAME_OVER = "The Great guardian was defeated"; + public static final String GAME_WIN = "The Great Guardian successfully closed the rift!"; + + + // Game Objects + public static final String BARRIER = "Barrier"; + public static final String WORKBENCH = "Workbench"; + public static final String WEAK_CELLS = "Weak cell"; + public static final String UNCHARGED_CELLS = "Uncharged cell"; + public static final String DEPOSIT_POOL = "Deposit pool"; + public static final String GAME_PARTS = "Guardian parts"; + public static final String LARGE_REMAINS = "Large guardian remains"; + public static final String HUGE_REMAINS = "Huge guardian remains"; + public static final String FRAGS = "Guardian fragments"; + public static final String ESS = "Guardian essence"; + public static final String PORTAL = "Portal"; + public static final int PORTAL_SPAWN = 43729; + + public static final String CATALYTIC_ENERGY = "Catalytic guardian stone"; + public static final String ELEMENTAL_ENERGY = "Elemental guardian stone"; + public static final String GREAT_GUARDIAN = "The Great Guardian"; + + public static final String CRAFT_RUNES = "Craft-rune"; + + public static final int AIR_SPRITE = 4353; + public static final int MIND_SPRITE = 4354; + public static final int WATER_SPRITE = 4355; + public static final int EARTH_SPRITE = 4356; + public static final int FIRE_SPRITE = 4357; + public static final int BODY_SPRITE = 4358; + public static final int COSMIC_SPRITE = 4359; + public static final int CHAOS_SPRITE = 4360; + public static final int NATURE_SPRITE = 4361; + public static final int LAW_SPRITE = 4362; + public static final int DEATH_SPRITE = 4363; + public static final int BLOOD_SPRITE = 4364; + +} diff --git a/src/main/java/ee/futur/gotr/data/Pouch.java b/src/main/java/ee/futur/gotr/data/Pouch.java new file mode 100644 index 0000000..82d1f2e --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/Pouch.java @@ -0,0 +1,24 @@ +package ee.futur.gotr.data; + +import lombok.Getter; +import lombok.Setter; + +public class Pouch { + + public Pouch(int id, int maxEssence) { + this.pouchID = id; + this.currentEssence = 0; + this.essenceTotal = maxEssence; + } + + @Getter + @Setter + int pouchID; + + @Getter + @Setter + int currentEssence; + + @Getter + int essenceTotal; +} diff --git a/src/main/java/ee/futur/gotr/data/Runes.java b/src/main/java/ee/futur/gotr/data/Runes.java new file mode 100644 index 0000000..4fc5fde --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/Runes.java @@ -0,0 +1,77 @@ +package ee.futur.gotr.data; + +/** + * Taken from marcojacobsNL + * https://github.com/marcojacobsNL/runelite-plugins/blob/master/src/main/java/com/koffee/KoffeeUtils/Runes.java + */ + +import com.google.common.collect.ImmutableMap; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import java.awt.image.BufferedImage; +import java.util.Map; + +import static net.runelite.api.ItemID.*; + +public enum Runes { + AIR(1, AIR_RUNE), + WATER(2, WATER_RUNE), + EARTH(3, EARTH_RUNE), + FIRE(4, FIRE_RUNE), + MIND(5, MIND_RUNE), + CHAOS(6, CHAOS_RUNE), + DEATH(7, DEATH_RUNE), + BLOOD(8, BLOOD_RUNE), + COSMIC(9, COSMIC_RUNE), + NATURE(10, NATURE_RUNE), + LAW(11, LAW_RUNE), + BODY(12, BODY_RUNE), + SOUL(13, SOUL_RUNE), + ASTRAL(14, ASTRAL_RUNE), + MIST(15, MIST_RUNE), + MUD(16, MUD_RUNE), + DUST(17, DUST_RUNE), + LAVA(18, LAVA_RUNE), + STEAM(19, STEAM_RUNE), + SMOKE(20, SMOKE_RUNE), + WRATH(21, WRATH_RUNE); + + private static final Map runes; + + static { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + for (Runes rune : values()) { + builder.put(rune.getId(), rune); + } + runes = builder.build(); + } + + @Getter(AccessLevel.PACKAGE) + private final int id; + @Getter(AccessLevel.PUBLIC) + private final int itemId; + @Getter(AccessLevel.PACKAGE) + @Setter(AccessLevel.PACKAGE) + private BufferedImage image; + + Runes(final int id, final int itemId) { + this.id = id; + this.itemId = itemId; + } + + public static Runes getRuneVarbit(int runeID) { + return runes.get(runeID); + } + + public String getName() { + String name = this.name(); + name = name.substring(0, 1) + name.substring(1).toLowerCase(); + return name; + } + + public static Runes getRune(int varbit) { + return runes.get(varbit); + } +} \ No newline at end of file diff --git a/src/main/java/ee/futur/gotr/data/Utility.java b/src/main/java/ee/futur/gotr/data/Utility.java new file mode 100644 index 0000000..7ef55d4 --- /dev/null +++ b/src/main/java/ee/futur/gotr/data/Utility.java @@ -0,0 +1,49 @@ +package ee.futur.gotr.data; + +import net.runelite.api.QuestState; + +import java.util.HashSet; +import java.util.Set; + +public class Utility { + + public static int getHighestLevelRuneIndex(int level) { + if (level < 35) { + return 7; + } else if (level < 44) { + return 8; + } else if (level < 54) { + return 9; + } else if (level < 65) { + return 10; + } else if (level < 77) { + return 11; + } + + return 12; + } + + public static Set getAccessibleAltars(int level, QuestState city, QuestState troll, QuestState mep, QuestState sotf) { + Set accessibleAltars = new HashSet<>(); + for (int i = 0; i < getHighestLevelRuneIndex(level); i++) { + Altar[] altars = Altar.values(); + if (altars[i] == Altar.COSMIC && city != QuestState.FINISHED) { + continue; + } + if (altars[i] == Altar.LAW && troll != QuestState.FINISHED) { + continue; + } + if (altars[i] == Altar.DEATH && mep != QuestState.FINISHED) { + continue; + } + if (altars[i] == Altar.BLOOD && sotf != QuestState.FINISHED) { + continue; + } + accessibleAltars.add(altars[i].id); + } + + return accessibleAltars; + } + + +} diff --git a/src/main/java/ee/futur/utils/InventoryUtil.java b/src/main/java/ee/futur/utils/InventoryUtil.java new file mode 100644 index 0000000..4c657eb --- /dev/null +++ b/src/main/java/ee/futur/utils/InventoryUtil.java @@ -0,0 +1,186 @@ +package ee.futur.utils; + + +import ee.futur.baseapi.collections.Inventory; +import ee.futur.baseapi.collections.query.ItemQuery; +import ee.futur.baseapi.BaseApiPlugin; + +import ee.futur.gotr.data.Runes; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; + +import java.util.*; + +public class InventoryUtil { + public static boolean useItemNoCase(String name, String... actions) { + return nameContainsNoCase(name).first().flatMap(item -> + { + //MousePackets.queueClickPacket(); + //WidgetPackets.queueWidgetAction(item, actions); + return Optional.of(true); + }).orElse(false); + } + + public static ItemQuery nameContainsNoCase(String name) { + return Inventory.search().filter(widget -> widget.getName().toLowerCase().contains(name.toLowerCase())); + } + + public static Optional getById(int id) { + return Inventory.search().withId(id).first(); + } + + public static Optional getItemNameContains(String name, boolean caseSensitive) { + if (caseSensitive) { + return Inventory.search().filter(widget -> widget.getName().contains(name)).first(); + } else { + return Inventory.search().filter(widget -> widget.getName().toLowerCase().contains(name.toLowerCase())).first(); + } + } + + public static Optional getItemNameContains(String name) { + return getItemNameContains(name, true); + } + + public static Optional getItem(String name, boolean caseSensitive) { + if (caseSensitive) { + return Inventory.search().filter(widget -> widget.getName().equals(name)).first(); + } else { + return Inventory.search().filter(widget -> widget.getName().toLowerCase().equals(name.toLowerCase())).first(); + } + } + + public static Optional getItem(String name) { + return getItem(name, true); + } + + public static int getItemAmount(String name, boolean stacked) { + if (stacked) { + return nameContainsNoCase(name).first().isPresent() ? nameContainsNoCase(name).first().get().getItemQuantity() : 0; + } + + return nameContainsNoCase(name).result().size(); + } + + public static int getItemAmount(int id) { + return getItemAmount(id, false); + } + + public static int getItemAmount(int id, boolean stacked) { + if (stacked) { + return getById(id).isPresent() ? getById(id).get().getItemQuantity() : 0; + } + + return Inventory.search().withId(id).result().size(); + } + + public static boolean hasItem(String name) { + return getItemAmount(name, false) > 0; + } + + public static boolean hasItem(String name, boolean stacked) { + return getItemAmount(name, stacked) > 0; + } + + public static boolean hasItem(String name, int amount) { + return getItemAmount(name, false) >= amount; + } + + public static boolean hasItem(String name, int amount, boolean stacked) { + return getItemAmount(name, stacked) >= amount; + } + + public static boolean hasItems(String ...names) { + for (String name : names) { + if (!hasItem(name)) { + return false; + } + } + + return true; + } + + public static boolean hasAnyItems(String ...names) { + for (String name : names) { + if (hasItem(name)) { + return true; + } + } + + return false; + } + public static boolean hasAnyItems(Collection itemIds) { + for (Integer id : itemIds) { + if (hasItem(id)) { + return true; + } + } + return false; + } + + public static boolean hasItem(int id) { + return getItemAmount(id) > 0; + } + + public static List getItems() { + return Inventory.search().result(); + } + + public static int emptySlots() { + return 28 - Inventory.search().result().size(); + } + + //Credit to marcojacobsNL + public static boolean runePouchContains(int id) { + Set runePouchIds = new HashSet<>(); + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE1) != 0) { + runePouchIds.add(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE1)).getItemId()); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE2) != 0) { + runePouchIds.add(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE2)).getItemId()); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE3) != 0) { + runePouchIds.add(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE3)).getItemId()); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE4) != 0) { + runePouchIds.add(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE4)).getItemId()); + } + for (int runePouchId : runePouchIds) { + if (runePouchId == id) { + return true; + } + } + return false; + } + + //Credit to marcojacobsNL + public static boolean runePouchContains(Collection ids) { + for (int runeId : ids) { + if (!runePouchContains(runeId)) { + return false; + } + } + return true; + } + + //Credit to marcojacobsNL + public static int runePouchQuanitity(int id) { + Map runePouchSlots = new HashMap<>(); + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE1) != 0) { + runePouchSlots.put(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE1)).getItemId(), BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_AMOUNT1)); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE2) != 0) { + runePouchSlots.put(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE2)).getItemId(), BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_AMOUNT2)); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE3) != 0) { + runePouchSlots.put(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE3)).getItemId(), BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_AMOUNT3)); + } + if (BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE4) != 0) { + runePouchSlots.put(Runes.getRune(BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_RUNE4)).getItemId(), BaseApiPlugin.getClient().getVarbitValue(Varbits.RUNE_POUCH_AMOUNT4)); + } + if (runePouchSlots.containsKey(id)) { + return runePouchSlots.get(id); + } + return 0; + } + +} diff --git a/src/main/java/ee/futur/utils/ObfuscatedNames.java b/src/main/java/ee/futur/utils/ObfuscatedNames.java new file mode 100644 index 0000000..1dd8269 --- /dev/null +++ b/src/main/java/ee/futur/utils/ObfuscatedNames.java @@ -0,0 +1,523 @@ +package ee.futur.utils; + +public final class ObfuscatedNames { + +// public static final String EVENT_MOUSE_CLICK_OBFUSCATEDNAME = "cv"; +// public static final String EVENT_MOUSE_CLICK_WRITE1 = "mouseInfo"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME1 = "xg"; +// public static final String EVENT_MOUSE_CLICK_WRITE2 = "mouseY"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME2 = "xg"; +// public static final String EVENT_MOUSE_CLICK_WRITE3 = "mouseX"; +// public static final String EVENT_MOUSE_CLICK_METHOD_NAME3 = "xg"; +// public static final String[][] EVENT_MOUSE_CLICK_WRITES = new String[][] { +// {"r 8", "v"}, +// {"r 8", "v"}, +// {"r 8", "v"} +// }; + + // when officially live we switch to MOUSE_V2 packet + public static final String EVENT_MOUSE_CLICK_OBFUSCATEDNAME = "ch"; + public static final String EVENT_MOUSE_CLICK_WRITE1 = "mouseX"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME1 = "dy"; + public static final String EVENT_MOUSE_CLICK_WRITE2 = "mouseInfo"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME2 = "kl"; + public static final String EVENT_MOUSE_CLICK_WRITE3 = "0"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME3 = "bg"; + public static final String EVENT_MOUSE_CLICK_WRITE4 = "mouseY"; + public static final String EVENT_MOUSE_CLICK_METHOD_NAME4 = "kl"; + public static final String[][] EVENT_MOUSE_CLICK_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128", "r 8"}, + {"v"}, + {"a 128", "r 8"}, + }; + + public static final String IF_BUTTONT_OBFUSCATEDNAME = "cn"; + public static final String IF_BUTTONT_WRITE1 = "destinationItemId"; + public static final String IF_BUTTONT_METHOD_NAME1 = "kl"; + public static final String IF_BUTTONT_WRITE2 = "destinationWidgetId"; + public static final String IF_BUTTONT_METHOD_NAME2 = "eg"; + public static final String IF_BUTTONT_WRITE3 = "sourceItemId"; + public static final String IF_BUTTONT_METHOD_NAME3 = "mp"; + public static final String IF_BUTTONT_WRITE4 = "destinationSlot"; + public static final String IF_BUTTONT_METHOD_NAME4 = "kl"; + public static final String IF_BUTTONT_WRITE5 = "sourceWidgetId"; + public static final String IF_BUTTONT_METHOD_NAME5 = "eg"; + public static final String IF_BUTTONT_WRITE6 = "sourceSlot"; + public static final String IF_BUTTONT_METHOD_NAME6 = "mp"; + public static final String[][] IF_BUTTONT_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + }; + + public static final String IF_BUTTONX_OBFUSCATEDNAME = "al"; + public static final String IF_BUTTONX_WRITE1 = "widgetId"; + public static final String IF_BUTTONX_METHOD_NAME_1 = "bu"; + public static final String IF_BUTTONX_WRITE2 = "slot"; + public static final String IF_BUTTONX_METHOD_NAME_2 = "bt"; + public static final String IF_BUTTONX_WRITE3 = "itemId"; + public static final String IF_BUTTONX_METHOD_NAME_3 = "bt"; + public static final String IF_BUTTONX_WRITE4 = "opCode"; + public static final String IF_BUTTONX_METHOD_NAME_4 = "bg"; + public static final String[][] IF_BUTTONX_WRITES = { + {"r 24", "r 16", "r 8", "v"}, + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + }; + + public static final String IF_SUBOP_OBFUSCATEDNAME = "dj"; + public static final String IF_SUBOP_WRITE1 = "widgetId"; + public static final String IF_SUBOP_METHOD_NAME1 = "bu"; + public static final String IF_SUBOP_WRITE2 = "slot"; + public static final String IF_SUBOP_METHOD_NAME2 = "bt"; + public static final String IF_SUBOP_WRITE3 = "itemId"; + public static final String IF_SUBOP_METHOD_NAME3 = "bt"; + public static final String IF_SUBOP_WRITE4 = "menuIndex"; + public static final String IF_SUBOP_METHOD_NAME4 = "bg"; + public static final String IF_SUBOP_WRITE5 = "subActionIndex"; + public static final String IF_SUBOP_METHOD_NAME5 = "bg"; + public static final String[][] IF_SUBOP_WRITES = new String[][]{ + {"r 24", "r 16", "r 8", "v"}, + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + {"v"} + }; + + public static final String MOVE_GAMECLICK_OBFUSCATEDNAME = "bd"; + public static final String MOVE_GAMECLICK_WRITE1 = "5"; + public static final String MOVE_GAMECLICK_METHOD_NAME1 = "bg"; + public static final String MOVE_GAMECLICK_WRITE2 = "worldPointX"; + public static final String MOVE_GAMECLICK_METHOD_NAME2 = "dy"; + public static final String MOVE_GAMECLICK_WRITE3 = "worldPointY"; + public static final String MOVE_GAMECLICK_METHOD_NAME3 = "dy"; + public static final String MOVE_GAMECLICK_WRITE4 = "ctrlDown"; + public static final String MOVE_GAMECLICK_METHOD_NAME4 = "bg"; + public static final String[][] MOVE_GAMECLICK_WRITES = new String[][]{ + {"v"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"v"}, + }; + public static final String OPLOC1_OBFUSCATEDNAME = "bi"; + public static final String OPLOC1_WRITE1 = "objectId"; + public static final String OPLOC1_METHOD_NAME1 = "bt"; + public static final String OPLOC1_WRITE2 = "ctrlDown"; + public static final String OPLOC1_METHOD_NAME2 = "db"; + public static final String OPLOC1_WRITE3 = "worldPointX"; + public static final String OPLOC1_METHOD_NAME3 = "dy"; + public static final String OPLOC1_WRITE4 = "worldPointY"; + public static final String OPLOC1_METHOD_NAME4 = "bt"; + public static final String[][] OPLOC1_WRITES = new String[][]{ + {"r 8", "v"}, + {"s 0"}, + {"v", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPLOC2_OBFUSCATEDNAME = "bw"; + public static final String OPLOC2_WRITE1 = "worldPointX"; + public static final String OPLOC2_METHOD_NAME1 = "mp"; + public static final String OPLOC2_WRITE2 = "objectId"; + public static final String OPLOC2_METHOD_NAME2 = "bt"; + public static final String OPLOC2_WRITE3 = "worldPointY"; + public static final String OPLOC2_METHOD_NAME3 = "mp"; + public static final String OPLOC2_WRITE4 = "ctrlDown"; + public static final String OPLOC2_METHOD_NAME4 = "dg"; + public static final String[][] OPLOC2_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"r 8", "v"}, + {"r 8", "a 128"}, + {"a 128"}, + }; + public static final String OPLOC3_OBFUSCATEDNAME = "by"; + public static final String OPLOC3_WRITE1 = "worldPointY"; + public static final String OPLOC3_METHOD_NAME1 = "dy"; + public static final String OPLOC3_WRITE2 = "ctrlDown"; + public static final String OPLOC3_METHOD_NAME2 = "dg"; + public static final String OPLOC3_WRITE3 = "worldPointX"; + public static final String OPLOC3_METHOD_NAME3 = "kl"; + public static final String OPLOC3_WRITE4 = "objectId"; + public static final String OPLOC3_METHOD_NAME4 = "kl"; + public static final String[][] OPLOC3_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128"}, + {"a 128", "r 8"}, + {"a 128", "r 8"}, + }; + public static final String OPLOC4_OBFUSCATEDNAME = "dk"; + public static final String OPLOC4_WRITE1 = "objectId"; + public static final String OPLOC4_METHOD_NAME1 = "bt"; + public static final String OPLOC4_WRITE2 = "worldPointX"; + public static final String OPLOC4_METHOD_NAME2 = "bt"; + public static final String OPLOC4_WRITE3 = "ctrlDown"; + public static final String OPLOC4_METHOD_NAME3 = "bg"; + public static final String OPLOC4_WRITE4 = "worldPointY"; + public static final String OPLOC4_METHOD_NAME4 = "mp"; + public static final String[][] OPLOC4_WRITES = new String[][]{ + {"r 8", "v"}, + {"r 8", "v"}, + {"v"}, + {"r 8", "a 128"}, + }; + public static final String OPLOC5_OBFUSCATEDNAME = "cl"; + public static final String OPLOC5_WRITE1 = "objectId"; + public static final String OPLOC5_METHOD_NAME1 = "bt"; + public static final String OPLOC5_WRITE2 = "ctrlDown"; + public static final String OPLOC5_METHOD_NAME2 = "db"; + public static final String OPLOC5_WRITE3 = "worldPointY"; + public static final String OPLOC5_METHOD_NAME3 = "kl"; + public static final String OPLOC5_WRITE4 = "worldPointX"; + public static final String OPLOC5_METHOD_NAME4 = "bt"; + public static final String[][] OPLOC5_WRITES = new String[][]{ + {"r 8", "v"}, + {"s 0"}, + {"a 128", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPLOCT_OBFUSCATEDNAME = "ah"; + public static final String OPLOCT_WRITE1 = "ctrlDown"; + public static final String OPLOCT_METHOD_NAME1 = "dh"; + public static final String OPLOCT_WRITE2 = "slot"; + public static final String OPLOCT_METHOD_NAME2 = "dy"; + public static final String OPLOCT_WRITE3 = "worldPointX"; + public static final String OPLOCT_METHOD_NAME3 = "dy"; + public static final String OPLOCT_WRITE4 = "objectId"; + public static final String OPLOCT_METHOD_NAME4 = "kl"; + public static final String OPLOCT_WRITE5 = "worldPointY"; + public static final String OPLOCT_METHOD_NAME5 = "bt"; + public static final String OPLOCT_WRITE6 = "itemId"; + public static final String OPLOCT_METHOD_NAME6 = "dy"; + public static final String OPLOCT_WRITE7 = "widgetId"; + public static final String OPLOCT_METHOD_NAME7 = "eg"; + public static final String[][] OPLOCT_WRITES = new String[][]{ + {"s 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"a 128", "r 8"}, + {"r 8", "v"}, + {"v", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + }; + public static final String OPNPC1_OBFUSCATEDNAME = "ac"; + public static final String OPNPC1_WRITE1 = "npcIndex"; + public static final String OPNPC1_METHOD_NAME1 = "dy"; + public static final String OPNPC1_WRITE2 = "ctrlDown"; + public static final String OPNPC1_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC1_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + }; + public static final String OPNPC2_OBFUSCATEDNAME = "cr"; + public static final String OPNPC2_WRITE1 = "ctrlDown"; + public static final String OPNPC2_METHOD_NAME1 = "bg"; + public static final String OPNPC2_WRITE2 = "npcIndex"; + public static final String OPNPC2_METHOD_NAME2 = "kl"; + public static final String[][] OPNPC2_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPNPC3_OBFUSCATEDNAME = "dw"; + public static final String OPNPC3_WRITE1 = "npcIndex"; + public static final String OPNPC3_METHOD_NAME1 = "dy"; + public static final String OPNPC3_WRITE2 = "ctrlDown"; + public static final String OPNPC3_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC3_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + }; + public static final String OPNPC4_OBFUSCATEDNAME = "ar"; + public static final String OPNPC4_WRITE1 = "npcIndex"; + public static final String OPNPC4_METHOD_NAME1 = "mp"; + public static final String OPNPC4_WRITE2 = "ctrlDown"; + public static final String OPNPC4_METHOD_NAME2 = "dh"; + public static final String[][] OPNPC4_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"s 128"}, + }; + public static final String OPNPC5_OBFUSCATEDNAME = "ab"; + public static final String OPNPC5_WRITE1 = "npcIndex"; + public static final String OPNPC5_METHOD_NAME1 = "dy"; + public static final String OPNPC5_WRITE2 = "ctrlDown"; + public static final String OPNPC5_METHOD_NAME2 = "dg"; + public static final String[][] OPNPC5_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128"}, + }; + public static final String OPNPCT_OBFUSCATEDNAME = "cf"; + public static final String OPNPCT_WRITE1 = "slot"; + public static final String OPNPCT_METHOD_NAME1 = "kl"; + public static final String OPNPCT_WRITE2 = "widgetId"; + public static final String OPNPCT_METHOD_NAME2 = "es"; + public static final String OPNPCT_WRITE3 = "itemId"; + public static final String OPNPCT_METHOD_NAME3 = "dy"; + public static final String OPNPCT_WRITE4 = "npcIndex"; + public static final String OPNPCT_METHOD_NAME4 = "bt"; + public static final String OPNPCT_WRITE5 = "ctrlDown"; + public static final String OPNPCT_METHOD_NAME5 = "db"; + public static final String[][] OPNPCT_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 16", "r 24", "v", "r 8"}, + {"v", "r 8"}, + {"r 8", "v"}, + {"s 0"}, + }; + public static final String OPOBJ1_OBFUSCATEDNAME = "ct"; + public static final String OPOBJ1_WRITE1 = "ctrlDown"; + public static final String OPOBJ1_METHOD_NAME1 = "dg"; + public static final String OPOBJ1_WRITE2 = "worldPointY"; + public static final String OPOBJ1_METHOD_NAME2 = "dy"; + public static final String OPOBJ1_WRITE3 = "objectId"; + public static final String OPOBJ1_METHOD_NAME3 = "dy"; + public static final String OPOBJ1_WRITE4 = "worldPointX"; + public static final String OPOBJ1_METHOD_NAME4 = "bt"; + public static final String[][] OPOBJ1_WRITES = new String[][]{ + {"a 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"r 8", "v"}, + }; + public static final String OPOBJ2_OBFUSCATEDNAME = "be"; + public static final String OPOBJ2_WRITE1 = "worldPointX"; + public static final String OPOBJ2_METHOD_NAME1 = "mp"; + public static final String OPOBJ2_WRITE2 = "worldPointY"; + public static final String OPOBJ2_METHOD_NAME2 = "dy"; + public static final String OPOBJ2_WRITE3 = "ctrlDown"; + public static final String OPOBJ2_METHOD_NAME3 = "bg"; + public static final String OPOBJ2_WRITE4 = "objectId"; + public static final String OPOBJ2_METHOD_NAME4 = "bt"; + public static final String[][] OPOBJ2_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v", "r 8"}, + {"v"}, + {"r 8", "v"}, + }; + public static final String OPOBJ3_OBFUSCATEDNAME = "cu"; + public static final String OPOBJ3_WRITE1 = "worldPointY"; + public static final String OPOBJ3_METHOD_NAME1 = "mp"; + public static final String OPOBJ3_WRITE2 = "ctrlDown"; + public static final String OPOBJ3_METHOD_NAME2 = "bg"; + public static final String OPOBJ3_WRITE3 = "worldPointX"; + public static final String OPOBJ3_METHOD_NAME3 = "kl"; + public static final String OPOBJ3_WRITE4 = "objectId"; + public static final String OPOBJ3_METHOD_NAME4 = "mp"; + public static final String[][] OPOBJ3_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v"}, + {"a 128", "r 8"}, + {"r 8", "a 128"}, + }; + public static final String OPOBJ4_OBFUSCATEDNAME = "ao"; + public static final String OPOBJ4_WRITE1 = "worldPointX"; + public static final String OPOBJ4_METHOD_NAME1 = "dy"; + public static final String OPOBJ4_WRITE2 = "ctrlDown"; + public static final String OPOBJ4_METHOD_NAME2 = "dh"; + public static final String OPOBJ4_WRITE3 = "worldPointY"; + public static final String OPOBJ4_METHOD_NAME3 = "dy"; + public static final String OPOBJ4_WRITE4 = "objectId"; + public static final String OPOBJ4_METHOD_NAME4 = "dy"; + public static final String[][] OPOBJ4_WRITES = new String[][]{ + {"v", "r 8"}, + {"s 128"}, + {"v", "r 8"}, + {"v", "r 8"}, + }; + public static final String OPOBJ5_OBFUSCATEDNAME = "cy"; + public static final String OPOBJ5_WRITE1 = "worldPointY"; + public static final String OPOBJ5_METHOD_NAME1 = "bt"; + public static final String OPOBJ5_WRITE2 = "objectId"; + public static final String OPOBJ5_METHOD_NAME2 = "dy"; + public static final String OPOBJ5_WRITE3 = "worldPointX"; + public static final String OPOBJ5_METHOD_NAME3 = "mp"; + public static final String OPOBJ5_WRITE4 = "ctrlDown"; + public static final String OPOBJ5_METHOD_NAME4 = "db"; + public static final String[][] OPOBJ5_WRITES = new String[][]{ + {"r 8", "v"}, + {"v", "r 8"}, + {"r 8", "a 128"}, + {"s 0"}, + }; + public static final String OPOBJT_OBFUSCATEDNAME = "cd"; + public static final String OPOBJT_WRITE1 = "itemId"; + public static final String OPOBJT_METHOD_NAME1 = "dy"; + public static final String OPOBJT_WRITE2 = "worldPointY"; + public static final String OPOBJT_METHOD_NAME2 = "kl"; + public static final String OPOBJT_WRITE3 = "ctrlDown"; + public static final String OPOBJT_METHOD_NAME3 = "db"; + public static final String OPOBJT_WRITE4 = "worldPointX"; + public static final String OPOBJT_METHOD_NAME4 = "mp"; + public static final String OPOBJT_WRITE5 = "objectId"; + public static final String OPOBJT_METHOD_NAME5 = "kl"; + public static final String OPOBJT_WRITE6 = "widgetId"; + public static final String OPOBJT_METHOD_NAME6 = "eg"; + public static final String OPOBJT_WRITE7 = "slot"; + public static final String OPOBJT_METHOD_NAME7 = "mp"; + public static final String[][] OPOBJT_WRITES = new String[][]{ + {"v", "r 8"}, + {"a 128", "r 8"}, + {"s 0"}, + {"r 8", "a 128"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"}, + {"r 8", "a 128"}, + }; + public static final String OPPLAYER1_OBFUSCATEDNAME = "am"; + public static final String OPPLAYER1_WRITE1 = "playerIndex"; + public static final String OPPLAYER1_METHOD_NAME1 = "dy"; + public static final String OPPLAYER1_WRITE2 = "ctrlDown"; + public static final String OPPLAYER1_METHOD_NAME2 = "bg"; + public static final String[][] OPPLAYER1_WRITES = new String[][]{ + {"v", "r 8"}, + {"v"}, + }; + public static final String OPPLAYER2_OBFUSCATEDNAME = "bx"; + public static final String OPPLAYER2_WRITE1 = "playerIndex"; + public static final String OPPLAYER2_METHOD_NAME1 = "bt"; + public static final String OPPLAYER2_WRITE2 = "ctrlDown"; + public static final String OPPLAYER2_METHOD_NAME2 = "dg"; + public static final String[][] OPPLAYER2_WRITES = new String[][]{ + {"r 8", "v"}, + {"a 128"}, + }; + public static final String OPPLAYER3_OBFUSCATEDNAME = "cc"; + public static final String OPPLAYER3_WRITE1 = "playerIndex"; + public static final String OPPLAYER3_METHOD_NAME1 = "mp"; + public static final String OPPLAYER3_WRITE2 = "ctrlDown"; + public static final String OPPLAYER3_METHOD_NAME2 = "db"; + public static final String[][] OPPLAYER3_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"s 0"}, + }; + public static final String OPPLAYER4_OBFUSCATEDNAME = "bv"; + public static final String OPPLAYER4_WRITE1 = "ctrlDown"; + public static final String OPPLAYER4_METHOD_NAME1 = "bg"; + public static final String OPPLAYER4_WRITE2 = "playerIndex"; + public static final String OPPLAYER4_METHOD_NAME2 = "mp"; + public static final String[][] OPPLAYER4_WRITES = new String[][]{ + {"v"}, + {"r 8", "a 128"}, + }; + public static final String OPPLAYER5_OBFUSCATEDNAME = "bc"; + public static final String OPPLAYER5_WRITE1 = "ctrlDown"; + public static final String OPPLAYER5_METHOD_NAME1 = "bg"; + public static final String OPPLAYER5_WRITE2 = "playerIndex"; + public static final String OPPLAYER5_METHOD_NAME2 = "kl"; + public static final String[][] OPPLAYER5_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPPLAYER6_OBFUSCATEDNAME = "ai"; + public static final String OPPLAYER6_WRITE1 = "playerIndex"; + public static final String OPPLAYER6_METHOD_NAME1 = "kl"; + public static final String OPPLAYER6_WRITE2 = "ctrlDown"; + public static final String OPPLAYER6_METHOD_NAME2 = "bg"; + public static final String[][] OPPLAYER6_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"v"}, + }; + public static final String OPPLAYER7_OBFUSCATEDNAME = "ce"; + public static final String OPPLAYER7_WRITE1 = "playerIndex"; + public static final String OPPLAYER7_METHOD_NAME1 = "kl"; + public static final String OPPLAYER7_WRITE2 = "ctrlDown"; + public static final String OPPLAYER7_METHOD_NAME2 = "dg"; + public static final String[][] OPPLAYER7_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"a 128"}, + }; + public static final String OPPLAYER8_OBFUSCATEDNAME = "bp"; + public static final String OPPLAYER8_WRITE1 = "ctrlDown"; + public static final String OPPLAYER8_METHOD_NAME1 = "bg"; + public static final String OPPLAYER8_WRITE2 = "playerIndex"; + public static final String OPPLAYER8_METHOD_NAME2 = "kl"; + public static final String[][] OPPLAYER8_WRITES = new String[][]{ + {"v"}, + {"a 128", "r 8"}, + }; + public static final String OPPLAYERT_OBFUSCATEDNAME = "ds"; + public static final String OPPLAYERT_WRITE1 = "playerIndex"; + public static final String OPPLAYERT_METHOD_NAME1 = "mp"; + public static final String OPPLAYERT_WRITE2 = "slot"; + public static final String OPPLAYERT_METHOD_NAME2 = "dy"; + public static final String OPPLAYERT_WRITE3 = "widgetId"; + public static final String OPPLAYERT_METHOD_NAME3 = "es"; + public static final String OPPLAYERT_WRITE4 = "ctrlDown"; + public static final String OPPLAYERT_METHOD_NAME4 = "dh"; + public static final String OPPLAYERT_WRITE5 = "itemId"; + public static final String OPPLAYERT_METHOD_NAME5 = "kl"; + public static final String[][] OPPLAYERT_WRITES = new String[][]{ + {"r 8", "a 128"}, + {"v", "r 8"}, + {"r 16", "r 24", "v", "r 8"}, + {"s 128"}, + {"a 128", "r 8"}, + }; + + public static final String OPHELDD_OBFUSCATEDNAME = "di"; + public static final String OPHELDD_WRITE1 = "selectedItemId"; + public static final String OPHELDD_METHOD_NAME1 = "bt"; + public static final String OPHELDD_WRITE2 = "destChildIndex"; + public static final String OPHELDD_METHOD_NAME2 = "dy"; + public static final String OPHELDD_WRITE3 = "destItemId"; + public static final String OPHELDD_METHOD_NAME3 = "dy"; + public static final String OPHELDD_WRITE4 = "selectedId"; + public static final String OPHELDD_METHOD_NAME4 = "en"; + public static final String OPHELDD_WRITE5 = "selectedChildIndex"; + public static final String OPHELDD_METHOD_NAME5 = "kl"; + public static final String OPHELDD_WRITE6 = "destId"; + public static final String OPHELDD_METHOD_NAME6 = "eg"; + public static final String[][] OPHELDD_WRITES = new String[][]{ + {"r 8", "v"}, + {"v", "r 8"}, + {"v", "r 8"}, + {"v", "r 8", "r 16", "r 24"}, + {"a 128", "r 8"}, + {"r 8", "v", "r 24", "r 16"} + }; + public static final String RESUME_COUNTDIALOG_OBFUSCATEDNAME = "au"; + public static final String RESUME_COUNTDIALOG_WRITE1 = "var0"; + public static final String RESUME_COUNTDIALOG_METHOD_NAME1 = "bu"; + public static final String[][] RESUME_COUNTDIALOG_WRITES = new String[][]{ + {"r 24", "r 16", "r 8", "v"}, + }; + public static final String RESUME_PAUSEBUTTON_OBFUSCATEDNAME = "bj"; + public static final String RESUME_PAUSEBUTTON_WRITE1 = "var1"; + public static final String RESUME_PAUSEBUTTON_METHOD_NAME1 = "kl"; + public static final String RESUME_PAUSEBUTTON_WRITE2 = "var0"; + public static final String RESUME_PAUSEBUTTON_METHOD_NAME2 = "es"; + public static final String[][] RESUME_PAUSEBUTTON_WRITES = new String[][]{ + {"a 128", "r 8"}, + {"r 16", "r 24", "v", "r 8"} + }; + + public static final String offsetMultiplier = "944624261"; + public static final String indexMultiplier = "-602712499"; + public static final String addNodeGarbageValue = "-41"; + public static final String getPacketBufferNodeGarbageValue = "-26977627"; + public static final String packetWriterFieldName = "cv"; + public static final String isaacCipherFieldName = "av"; + public static final String addNodeMethodName = "ac"; + public static final String clientPacketClassName = "mi"; + public static final String packetWriterClassName = "dw"; + public static final String classContainingGetPacketBufferNodeName = "lh"; + public static final String packetBufferNodeClassName = "mb"; + public static final String packetBufferFieldName = "ap"; + public static final String bufferOffsetField = "aa"; + public static final String bufferArrayField = "ay"; + public static final String MouseHandler_lastPressedTimeMillisClass = "bx"; + public static final String MouseHandler_lastPressedTimeMillisField = "ag"; + public static final String clientMillisField = "jp"; + public static final String mouseHandlerMillisMultiplier = "4013550640572753771"; + public static final String clientMillisMultiplier = "7881463686914378693"; + public static final int getAnimationMultiplier = 2116322795; + public static final int skullIconMultiplier = 0; + public static final String skullIconField = "null"; + + public static final int pathLengthMultiplier = 0; + public static final String pathLengthFieldName = "null"; + public static final String doActionClassName = "fy"; + public static final String doActionMethodName = "lu"; +} diff --git a/src/test/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPluginTest.java b/src/test/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPluginTest.java deleted file mode 100644 index d64f632..0000000 --- a/src/test/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPluginTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.toofifty.easygiantsfoundry; - -import net.runelite.client.RuneLite; -import net.runelite.client.externalplugins.ExternalPluginManager; - -public class EasyGiantsFoundryPluginTest -{ - public static void main(String[] args) throws Exception - { - ExternalPluginManager.loadBuiltin(EasyGiantsFoundryPlugin.class); - RuneLite.main(args); - } -} \ No newline at end of file diff --git a/src/test/java/ee/futur/easygiantsfoundry/K4rliPluginsTest.java b/src/test/java/ee/futur/easygiantsfoundry/K4rliPluginsTest.java new file mode 100644 index 0000000..060493e --- /dev/null +++ b/src/test/java/ee/futur/easygiantsfoundry/K4rliPluginsTest.java @@ -0,0 +1,18 @@ +package ee.futur.easygiantsfoundry; + +import ee.futur.baseapi.BaseApiPlugin; +import ee.futur.gotr.AutoRiftsPlugin; +import net.runelite.client.RuneLite; +import net.runelite.client.externalplugins.ExternalPluginManager; + +public class K4rliPluginsTest { + public static void main(String[] args) throws Exception { + ExternalPluginManager.loadBuiltin( + BaseApiPlugin.class, + //PacketUtilsPlugin.class, + EasyGiantsFoundryPlugin.class, + AutoRiftsPlugin.class + ); + RuneLite.main(args); + } +}