diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java index 80a11edc30..2cd15c48f9 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java @@ -24,10 +24,8 @@ */ package net.runelite.api.events; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import net.runelite.api.MenuEntry; +import lombok.Data; +import net.runelite.api.MenuAction; /** * An event where a menu option has been clicked. @@ -40,22 +38,35 @@ import net.runelite.api.MenuEntry; * By default, when there is no action performed when left-clicking, * it seems that this event still triggers with the "Cancel" action. */ -@Getter -public class MenuOptionClicked extends MenuEntry +@Data +public class MenuOptionClicked { - public MenuOptionClicked(String option, String target, int identifier, int opcode, int param0, int param1, boolean forceLeftClick) - { - super(option, target, identifier, opcode, param0, param1, forceLeftClick); - authentic = true; - } - - public MenuOptionClicked(String option, String target, int identifier, int opcode, int param0, int param1, boolean forceLeftClick, boolean authentic, int mouseButton) - { - super(option, target, identifier, opcode, param0, param1, forceLeftClick); - this.authentic = authentic; - this.mouseButton = mouseButton; - } - + /** + * The action parameter used in the click. + */ + private int actionParam; + /** + * The option text added to the menu. + */ + private String menuOption; + /** + * The target of the action. + */ + private String menuTarget; + /** + * The action performed. + */ + private MenuAction menuAction; + /** + * The ID of the object, actor, or item that the interaction targets. + */ + private int id; + /** + * The ID of the widget where the menu was clicked. + * + * @see net.runelite.api.widgets.WidgetID + */ + private int widgetId; /** * The selected item index at the time of the option click. */ @@ -65,11 +76,6 @@ public class MenuOptionClicked extends MenuEntry */ private boolean consumed; - /** - * The mouse button will be 1 if a non draggable widget was clicked, - */ - private int mouseButton; - /** * Marks the event as having been consumed. *

@@ -81,36 +87,4 @@ public class MenuOptionClicked extends MenuEntry { this.consumed = true; } - - /** - * Whether or not the event is authentic. - */ - @Setter(AccessLevel.NONE) - private final boolean authentic; - - public void setMenuEntry(MenuEntry e) - { - setOption(e.getOption()); - setTarget(e.getTarget()); - setIdentifier(e.getIdentifier()); - setOpcode(e.getOpcode()); - setActionParam(e.getActionParam()); - setActionParam1(e.getActionParam1()); - setForceLeftClick(e.isForceLeftClick()); - } - - public int getWidgetId() - { - return getActionParam1(); - } - - public String getMenuTarget() - { - return getTarget(); - } - - public String getMenuOption() - { - return getOption(); - } } diff --git a/runelite-client/src/main/java/com/openosrs/client/game/SoundManager.java b/runelite-client/src/main/java/com/openosrs/client/game/SoundManager.java index 0f46afb1f8..058c575793 100644 --- a/runelite-client/src/main/java/com/openosrs/client/game/SoundManager.java +++ b/runelite-client/src/main/java/com/openosrs/client/game/SoundManager.java @@ -28,11 +28,10 @@ public class SoundManager this.runeliteConfig = runeLiteConfig; } - public void playSound(final Sound sound) + public void play(final Sound sound) { new Thread(new Runnable() { - @Override public void run() { diff --git a/runelite-client/src/main/java/com/openosrs/client/game/WorldLocation.java b/runelite-client/src/main/java/com/openosrs/client/game/WorldLocation.java index 5a65f8ec98..ce347a1b26 100644 --- a/runelite-client/src/main/java/com/openosrs/client/game/WorldLocation.java +++ b/runelite-client/src/main/java/com/openosrs/client/game/WorldLocation.java @@ -1,13 +1,28 @@ -/******************************************************************************* - * Copyright (c) 2019 openosrs - * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. - * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: - * ST0NEWALL#9112 - * Macweese#1169 UID 159941566994186240, macweese@pm.me - * openosrs Discord: https://discord.gg/Q7wFtCe - * openosrs website: https://openosrs.com - ******************************************************************************/ - +/* + * Copyright (c) 2019, ST0NEWALL + * Copyright (c) 2020, Macweese + * 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 com.openosrs.client.game; import com.google.common.collect.ImmutableMap; diff --git a/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java b/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java index 7d5043bd55..f0d0fa1b2f 100644 --- a/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java +++ b/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java @@ -47,7 +47,7 @@ import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import com.openosrs.client.ui.OpenOSRSSplashScreen; import net.runelite.client.util.ImageUtil; -import com.openosrs.client.util.LinkBrowser; +import net.runelite.client.util.LinkBrowser; @Slf4j public class InfoPanel extends JPanel diff --git a/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java b/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java deleted file mode 100644 index 64df5e1127..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.openosrs.client.util; - -import java.awt.Desktop; -import java.awt.Toolkit; -import java.awt.datatransfer.StringSelection; -import java.io.File; -import java.io.IOException; -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class LinkBrowser extends net.runelite.client.util.LinkBrowser -{ - /** - * Tries to open the specified {@code File} with the systems default text editor. If operation fails - * an error message is displayed with the option to copy the absolute file path to clipboard. - * - * @param file the File instance of the log file - * @return did the file open successfully? - */ - public static boolean openLocalFile(final File file) - { - if (file == null || !file.exists()) - { - return false; - } - - if (attemptOpenLocalFile(file)) - { - log.debug("Opened log file through Desktop#edit to {}", file); - return true; - } - - showMessageBox("Unable to open log file. Press 'OK' and the file path will be copied to your clipboard", file.getAbsolutePath()); - return false; - } - - private static boolean attemptOpenLocalFile(final File file) - { - if (!Desktop.isDesktopSupported()) - { - return false; - } - - final Desktop desktop = Desktop.getDesktop(); - - if (!desktop.isSupported(Desktop.Action.OPEN)) - { - return false; - } - - try - { - desktop.open(file); - return true; - } - catch (IOException ex) - { - log.warn("Failed to open Desktop#edit {}", file, ex); - return false; - } - } - - /** - * Open swing message box with specified message and copy data to clipboard - * @param message message to show - */ - private static void showMessageBox(final String message, final String data) - { - SwingUtilities.invokeLater(() -> - { - final int result = JOptionPane.showConfirmDialog(null, message, "Message", - JOptionPane.OK_CANCEL_OPTION); - - if (result == JOptionPane.OK_OPTION) - { - final StringSelection stringSelection = new StringSelection(data); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); - } - }); - } -} diff --git a/runelite-client/src/main/java/com/openosrs/client/util/MiscUtils.java b/runelite-client/src/main/java/com/openosrs/client/util/MiscUtils.java deleted file mode 100644 index d5bc562121..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/util/MiscUtils.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.openosrs.client.util; - -import java.awt.Polygon; -import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.time.temporal.ChronoUnit; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import net.runelite.api.Client; -import net.runelite.api.Player; -import net.runelite.api.WorldType; -import net.runelite.api.coords.WorldPoint; - -public class MiscUtils -{ - private static final int[] abovePointsX = {2944, 3392, 3392, 2944}; - private static final int[] abovePointsY = {3523, 3523, 3971, 3971}; - private static final int[] belowPointsX = {2944, 2944, 3264, 3264}; - private static final int[] belowPointsY = {9918, 10360, 10360, 9918}; - - private static final Polygon abovePoly = new Polygon(abovePointsX, abovePointsY, abovePointsX.length); - private static final Polygon belowPoly = new Polygon(belowPointsX, belowPointsY, belowPointsX.length); - - private static final ChronoUnit[] ORDERED_CHRONOS = new ChronoUnit[] - { - ChronoUnit.YEARS, - ChronoUnit.MONTHS, - ChronoUnit.WEEKS, - ChronoUnit.DAYS, - ChronoUnit.HOURS, - ChronoUnit.MINUTES, - ChronoUnit.SECONDS - }; - - //test replacement so private for now - private static boolean inWildy(WorldPoint point) - { - if (point == null) - { - return false; - } - - return abovePoly.contains(point.getX(), point.getY()) || belowPoly.contains(point.getX(), point.getY()); - } - - public static int getWildernessLevelFrom(Client client, WorldPoint point) - { - if (client == null) - { - return 0; - } - - if (point == null) - { - return 0; - } - - int x = point.getX(); - - if (point.getPlane() == 0 && (x < 2940 || x > 3391)) - { - return 0; - } - - int y = point.getY(); - //v underground //v above ground - int wildernessLevel = clamp(y > 6400 ? ((y - 9920) / 8) + 1 : ((y - 3520) / 8) + 1, 0, 56); - - if (point.getPlane() > 0 && y < 9920) - { - wildernessLevel = 0; - } - - if (client.getWorldType().stream().anyMatch(worldType -> worldType == WorldType.PVP || worldType == WorldType.HIGH_RISK)) - { - wildernessLevel += 15; - } - - return Math.max(0, wildernessLevel); - } - - public static int clamp(int val, int min, int max) - { - return Math.max(min, Math.min(max, val)); - } - - public static float clamp(float val, float min, float max) - { - return Math.max(min, Math.min(max, val)); - } - - public static boolean inWilderness(Client client) - { - Player localPlayer = client.getLocalPlayer(); - - if (localPlayer == null) - { - return false; - } - - return inWildy(localPlayer.getWorldLocation()); - - //return getWildernessLevelFrom(client, localPlayer.getWorldLocation()) > 0; - } - - public static String formatTimeAgo(Duration dur) - { - long dA = 0, dB = 0, rm; - ChronoUnit cA = null, cB = null; - for (int i = 0; i < ORDERED_CHRONOS.length; i++) - { - cA = ORDERED_CHRONOS[i]; - dA = dur.getSeconds() / cA.getDuration().getSeconds(); - rm = dur.getSeconds() % cA.getDuration().getSeconds(); - if (dA <= 0) - { - cA = null; - continue; - } - - if (i + 1 < ORDERED_CHRONOS.length) - { - cB = ORDERED_CHRONOS[i + 1]; - dB = rm / cB.getDuration().getSeconds(); - - if (dB <= 0) - { - cB = null; - } - } - - break; - } - - if (cA == null) - { - return "just now."; - } - - String str = formatUnit(cA, dA); - - if (cB != null) - { - str += " and " + formatUnit(cB, dB); - } - - return str + " ago."; - } - - private static String formatUnit(ChronoUnit chrono, long val) - { - boolean multiple = val != 1; - String str; - if (multiple) - { - str = val + " "; - } - else - { - str = "a" + (chrono == ChronoUnit.HOURS ? "n " : " "); - } - str += chrono.name().toLowerCase(); - if (!multiple) - { - if (str.charAt(str.length() - 1) == 's') - { - str = str.substring(0, str.length() - 1); - } - } - else if (str.charAt(str.length() - 1) != 's') - { - str += "s"; - } - return str; - } - - /** - * Mostly stolen from {@link java.net.URLStreamHandler#toExternalForm(URL)} - * - * @param url URL to encode - * @return URL, with path, query and ref encoded - */ - public static String urlToStringEncoded(URL url) - { - String s; - String path = url.getPath() != null ? Stream.of(url.getPath().split("/")) - .map(s2 -> URLEncoder.encode(s2, StandardCharsets.UTF_8)).collect(Collectors.joining("/")) : ""; - return url.getProtocol() - + ':' - + (((s = url.getAuthority()) != null && s.length() > 0) ? "//" + s : "") - + (path) - + (((s = url.getQuery()) != null) ? '?' + urlEncode(s) : "") - + (((s = url.getRef()) != null) ? '#' + urlEncode(s) : ""); - } - - private static String urlEncode(String s) - { - return URLEncoder.encode(s, StandardCharsets.UTF_8); - } -} diff --git a/runelite-client/src/main/java/com/openosrs/client/util/PvPUtil.java b/runelite-client/src/main/java/com/openosrs/client/util/PvPUtil.java deleted file mode 100644 index 1f0120c75a..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/util/PvPUtil.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2019. PKLite - All Rights Reserved - * Unauthorized modification, distribution, or possession of this source file, via any medium is strictly prohibited. - * Proprietary and confidential. Refer to PKLite License file for more information on - * full terms of this copyright and to determine what constitutes authorized use. - * Written by PKLite(ST0NEWALL, others) , 2019 - * - */ -package com.openosrs.client.util; - -import net.runelite.api.Client; -import net.runelite.api.InventoryID; -import net.runelite.api.Item; -import net.runelite.api.ItemComposition; -import net.runelite.api.Player; -import net.runelite.api.Varbits; -import net.runelite.api.WorldType; -import net.runelite.api.coords.WorldPoint; -import net.runelite.api.geometry.Cuboid; -import net.runelite.client.game.ItemManager; -import net.runelite.client.util.QuantityFormatter; -import org.apache.commons.lang3.ArrayUtils; -import java.awt.Polygon; -import java.util.Comparator; -import java.util.Objects; -import java.util.TreeMap; - -public class PvPUtil -{ - private static final Polygon NOT_WILDERNESS_BLACK_KNIGHTS = new Polygon( // this is black knights castle - new int[]{2994, 2995, 2996, 2996, 2994, 2994, 2997, 2998, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3005, - 3005, 3019, 3020, 3022, 3023, 3024, 3025, 3026, 3026, 3027, 3027, 3028, 3028, 3029, 3029, 3030, 3030, 3031, - 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3037}, - new int[]{3525, 3526, 3527, 3529, 3529, 3534, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, - 3545, 3545, 3546, 3546, 3545, 3544, 3543, 3543, 3542, 3541, 3540, 3539, 3537, 3536, 3535, 3534, 3533, 3532, - 3531, 3530, 3529, 3528, 3527, 3526, 3526, 3525}, - 43 - ); - private static final Cuboid MAIN_WILDERNESS_CUBOID = new Cuboid(2944, 3525, 0, 3391, 4351, 3); - private static final Cuboid GOD_WARS_WILDERNESS_CUBOID = new Cuboid(3008, 10112, 0, 3071, 10175, 3); - private static final Cuboid WILDERNESS_UNDERGROUND_CUBOID = new Cuboid(2944, 9920, 0, 3391, 10879, 3); - - /** - * Gets the wilderness level based on a world point - * Java reimplementation of clientscript 384 [proc,wilderness_level] - * - * @param point the point in the world to get the wilderness level for - * @return the int representing the wilderness level - */ - public static int getWildernessLevelFrom(WorldPoint point) - { - if (MAIN_WILDERNESS_CUBOID.contains(point)) - { - if (NOT_WILDERNESS_BLACK_KNIGHTS.contains(point.getX(), point.getY())) - { - return 0; - } - - return ((point.getY() - 3520) / 8) + 1; // calc(((coordz(coord) - (55 * 64)) / 8) + 1) - } - else if (GOD_WARS_WILDERNESS_CUBOID.contains(point)) - { - return ((point.getY() - 9920) / 8) - 1; // calc(((coordz(coord) - (155 * 64)) / 8) - 1) - } - else if (WILDERNESS_UNDERGROUND_CUBOID.contains(point)) - { - return ((point.getY() - 9920) / 8) + 1; // calc(((coordz(coord) - (155 * 64)) / 8) + 1) - } - return 0; - } - - /** - * Determines if another player is attackable based off of wilderness level and combat levels - * - * @param client The client of the local player - * @param player the player to determine attackability - * @return returns true if the player is attackable, false otherwise - */ - public static boolean isAttackable(Client client, Player player) - { - int wildernessLevel = 0; - - if (WorldType.isDeadmanWorld(client.getWorldType())) - { - return true; - } - if (WorldType.isPvpWorld(client.getWorldType())) - { - wildernessLevel += 15; - } - if (client.getVar(Varbits.IN_WILDERNESS) == 1) - { - wildernessLevel += getWildernessLevelFrom(client.getLocalPlayer().getWorldLocation()); - } - return wildernessLevel != 0 && Math.abs(client.getLocalPlayer().getCombatLevel() - player.getCombatLevel()) <= wildernessLevel; - } - - public static int calculateRisk(Client client, ItemManager itemManager) - { - if (client.getItemContainer(InventoryID.EQUIPMENT) == null) - { - return 0; - } - if (client.getItemContainer(InventoryID.INVENTORY).getItems() == null) - { - return 0; - } - Item[] items = ArrayUtils.addAll(Objects.requireNonNull(client.getItemContainer(InventoryID.EQUIPMENT)).getItems(), - Objects.requireNonNull(client.getItemContainer(InventoryID.INVENTORY)).getItems()); - TreeMap priceMap = new TreeMap<>(Comparator.comparingInt(Integer::intValue)); - int wealth = 0; - for (Item i : items) - { - int value = (itemManager.getItemPrice(i.getId()) * i.getQuantity()); - - final ItemComposition itemComposition = itemManager.getItemComposition(i.getId()); - if (!itemComposition.isTradeable() && value == 0) - { - value = itemComposition.getPrice() * i.getQuantity(); - priceMap.put(value, i); - } - else - { - value = itemManager.getItemPrice(i.getId()) * i.getQuantity(); - if (i.getId() > 0 && value > 0) - { - priceMap.put(value, i); - } - } - wealth += value; - } - return Integer.parseInt(QuantityFormatter.quantityToRSDecimalStack(priceMap.keySet().stream().mapToInt(Integer::intValue).sum())); - - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/com/openosrs/client/util/SwingUtil.java b/runelite-client/src/main/java/com/openosrs/client/util/SwingUtil.java deleted file mode 100644 index 799b67bfa4..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/util/SwingUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.openosrs.client.util; - -import java.awt.EventQueue; -import java.lang.reflect.InvocationTargetException; - -public class SwingUtil extends net.runelite.client.util.SwingUtil -{ - public static void syncExec(final Runnable r) throws InvocationTargetException, InterruptedException - { - if (EventQueue.isDispatchThread()) - { - r.run(); - } - else - { - EventQueue.invokeAndWait(r); - } - } -} diff --git a/runelite-client/src/main/java/com/openosrs/client/util/NonScheduledExecutorServiceExceptionLogger.java b/runelite-client/src/main/java/net/runelite/client/NonScheduledExecutorServiceExceptionLogger.java similarity index 65% rename from runelite-client/src/main/java/com/openosrs/client/util/NonScheduledExecutorServiceExceptionLogger.java rename to runelite-client/src/main/java/net/runelite/client/NonScheduledExecutorServiceExceptionLogger.java index 08436116a5..219781b278 100644 --- a/runelite-client/src/main/java/com/openosrs/client/util/NonScheduledExecutorServiceExceptionLogger.java +++ b/runelite-client/src/main/java/net/runelite/client/NonScheduledExecutorServiceExceptionLogger.java @@ -1,4 +1,29 @@ -package com.openosrs.client.util; +/* + * Copyright (c) 2021, ThatGamerBlue + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.client; import java.util.Collection; import java.util.List; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index f673cee903..19dd5c0c65 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -30,7 +30,6 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.name.Names; import com.openosrs.client.config.OpenOSRSConfig; -import com.openosrs.client.util.NonScheduledExecutorServiceExceptionLogger; import java.applet.Applet; import java.io.File; import java.util.Properties; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java index 79ee6f1f53..7304a5a723 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java @@ -40,11 +40,11 @@ import com.openosrs.client.events.ExternalPluginChanged; import com.openosrs.client.events.ExternalRepositoryChanged; import com.openosrs.client.ui.OpenOSRSSplashScreen; import com.openosrs.client.util.Groups; -import com.openosrs.client.util.MiscUtils; -import com.openosrs.client.util.SwingUtil; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; @@ -76,6 +76,7 @@ import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.EventBus; import net.runelite.client.events.ConfigChanged; import net.runelite.client.ui.ClientUI; +import net.runelite.client.util.SwingUtil; import org.jgroups.Message; import org.pf4j.DefaultPluginManager; import org.pf4j.DependencyResolver; @@ -343,7 +344,7 @@ public class OPRSExternalPluginManager { config.append(repository.getId()); config.append("|"); - config.append(MiscUtils.urlToStringEncoded(repository.getUrl())); + config.append(urlToStringEncoded(repository.getUrl())); config.append(";"); } config.deleteCharAt(config.lastIndexOf(";")); @@ -1066,4 +1067,27 @@ public class OPRSExternalPluginManager } } + /** + * Mostly stolen from {@link java.net.URLStreamHandler#toExternalForm(URL)} + * + * @param url URL to encode + * @return URL, with path, query and ref encoded + */ + private static String urlToStringEncoded(URL url) + { + String s; + String path = url.getPath() != null ? Stream.of(url.getPath().split("/")) + .map(s2 -> URLEncoder.encode(s2, StandardCharsets.UTF_8)).collect(Collectors.joining("/")) : ""; + return url.getProtocol() + + ':' + + (((s = url.getAuthority()) != null && s.length() > 0) ? "//" + s : "") + + (path) + + (((s = url.getQuery()) != null) ? '?' + urlEncode(s) : "") + + (((s = url.getRef()) != null) ? '#' + urlEncode(s) : ""); + } + + private static String urlEncode(String s) + { + return URLEncoder.encode(s, StandardCharsets.UTF_8); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index b4d5934f2f..292f7b7414 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -87,7 +87,6 @@ public class PluginManager * Base package where the core plugins are */ private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; - private static final String OPENOSRS_PACKAGE = "com.openosrs.client.plugins"; private final boolean developerMode; private final boolean safeMode; @@ -291,10 +290,6 @@ public class PluginManager .map(ClassInfo::load) .collect(Collectors.toList()); - plugins.addAll(classPath.getTopLevelClassesRecursive(OPENOSRS_PACKAGE).stream() - .map(ClassInfo::load) - .collect(Collectors.toList())); - loadPlugins(plugins, (loaded, total) -> SplashScreen.stage(.60, .70, null, "Loading Plugins", loaded, total, false)); } diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java similarity index 95% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java index 54e540d0f6..c991795cce 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java @@ -24,17 +24,16 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -package com.openosrs.client.plugins.openosrs; +package net.runelite.client.plugins.openosrs; import ch.qos.logback.classic.Logger; import com.openosrs.client.config.OpenOSRSConfig; -import com.openosrs.client.plugins.openosrs.externals.ExternalPluginManagerPanel; +import net.runelite.client.plugins.openosrs.externals.ExternalPluginManagerPanel; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; -import net.runelite.client.callback.ClientThread; import net.runelite.client.config.Keybind; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; @@ -65,9 +64,6 @@ public class OpenOSRSPlugin extends Plugin @Inject private Client client; - @Inject - private ClientThread clientThread; - @Inject private ClientToolbar clientToolbar; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalBox.java similarity index 98% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalBox.java index cdaef1c8cd..51c9e94b90 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalBox.java @@ -1,4 +1,4 @@ -package com.openosrs.client.plugins.openosrs.externals; +package net.runelite.client.plugins.openosrs.externals; import java.awt.BorderLayout; import java.awt.Color; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java similarity index 99% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java index 57ba0b7bd1..c4c4ee8390 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java @@ -1,4 +1,4 @@ -package com.openosrs.client.plugins.openosrs.externals; +package net.runelite.client.plugins.openosrs.externals; import net.runelite.client.plugins.OPRSExternalPluginManager; import java.awt.BorderLayout; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/PluginsPanel.java similarity index 99% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/PluginsPanel.java index f8c7377c63..99fde9cc1f 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/PluginsPanel.java @@ -1,4 +1,4 @@ -package com.openosrs.client.plugins.openosrs.externals; +package net.runelite.client.plugins.openosrs.externals; import net.runelite.client.plugins.OPRSExternalPluginManager; import com.google.gson.JsonSyntaxException; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryBox.java similarity index 98% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryBox.java index cffc8d989f..8a1aec5eaf 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryBox.java @@ -1,4 +1,4 @@ -package com.openosrs.client.plugins.openosrs.externals; +package net.runelite.client.plugins.openosrs.externals; import net.runelite.client.plugins.OPRSExternalPluginManager; import com.openosrs.client.ui.JMultilineLabel; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryPanel.java similarity index 96% rename from runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java rename to runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryPanel.java index 6bd5181a51..ef3d7d5724 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/externals/RepositoryPanel.java @@ -1,4 +1,4 @@ -package com.openosrs.client.plugins.openosrs.externals; +package net.runelite.client.plugins.openosrs.externals; import net.runelite.client.plugins.OPRSExternalPluginManager; import com.openosrs.client.events.ExternalRepositoryChanged; diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index 92e3f8c773..219e0e2e48 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -577,4 +577,134 @@ public class ImageUtil } return image; } + + /** + * Draw fg centered on top of bg + */ + public static SpritePixels mergeSprites(final Client client, final SpritePixels bg, final SpritePixels fg) + { + assert fg.getHeight() <= bg.getHeight() && fg.getWidth() <= bg.getWidth() : "Background has to be larger than foreground"; + + final int[] canvas = Arrays.copyOf(bg.getPixels(), bg.getWidth() * bg.getHeight()); + final SpritePixels result = client.createSpritePixels(canvas, bg.getWidth(), bg.getHeight()); + + final int bgWid = bg.getWidth(); + final int fgHgt = fg.getHeight(); + final int fgWid = fg.getWidth(); + + final int xOffset = (bgWid - fgWid) / 2; + final int yOffset = (bg.getHeight() - fgHgt) / 2; + + final int[] fgPixels = fg.getPixels(); + + for (int y1 = yOffset, y2 = 0; y2 < fgHgt; y1++, y2++) + { + int i1 = y1 * bgWid + xOffset; + int i2 = y2 * fgWid; + + for (int x = 0; x < fgWid; x++, i1++, i2++) + { + if (fgPixels[i2] > 0) + { + canvas[i1] = fgPixels[i2]; + } + } + } + + return result; + } + + /** + * Resize Sprite sprite to given width (newW) and height (newH) + */ + public static SpritePixels resizeSprite(final Client client, final SpritePixels sprite, int newW, int newH) + { + assert newW > 0 && newH > 0; + + final int oldW = sprite.getWidth(); + final int oldH = sprite.getHeight(); + + if (oldW == newW && oldH == newH) + { + return sprite; + } + + final int[] canvas = new int[newW * newH]; + final int[] pixels = sprite.getPixels(); + + final SpritePixels result = client.createSpritePixels(canvas, newW, newH); + + int pixelX = 0; + int pixelY = 0; + + final int oldMaxW = sprite.getMaxWidth(); + final int oldMaxH = sprite.getMaxHeight(); + + final int pixelW = (oldMaxW << 16) / newW; + final int pixelH = (oldMaxH << 16) / newH; + + int xOffset = 0; + int yOffset = 0; + + int canvasIdx; + if (sprite.getOffsetX() > 0) + { + canvasIdx = (pixelW + (sprite.getOffsetX() << 16) - 1) / pixelW; + xOffset += canvasIdx; + pixelX += canvasIdx * pixelW - (sprite.getOffsetX() << 16); + } + + if (sprite.getOffsetY() > 0) + { + canvasIdx = (pixelH + (sprite.getOffsetY() << 16) - 1) / pixelH; + yOffset += canvasIdx; + pixelY += canvasIdx * pixelH - (sprite.getOffsetY() << 16); + } + + if (oldW < oldMaxW) + { + newW = (pixelW + ((oldW << 16) - pixelX) - 1) / pixelW; + } + + if (oldH < oldMaxH) + { + newH = (pixelH + ((oldH << 16) - pixelY) - 1) / pixelH; + } + + canvasIdx = xOffset + yOffset * newW; + int canvasOffset = 0; + if (yOffset + newH > newH) + { + newH -= yOffset + newH - newH; + } + + int tmp; + if (yOffset < 0) + { + tmp = -yOffset; + newH -= tmp; + canvasIdx += tmp * newW; + pixelY += pixelH * tmp; + } + + if (newW + xOffset > newW) + { + tmp = newW + xOffset - newW; + newW -= tmp; + canvasOffset += tmp; + } + + if (xOffset < 0) + { + tmp = -xOffset; + newW -= tmp; + canvasIdx += tmp; + pixelX += pixelW * tmp; + canvasOffset += tmp; + } + + client.scaleSprite(canvas, pixels, 0, pixelX, pixelY, canvasIdx, canvasOffset, newW, newH, pixelW, pixelH, oldW); + + return result; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java index e8965029c1..24828baa51 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java +++ b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java @@ -207,4 +207,54 @@ public class LinkBrowser } }); } + + /** + * Tries to open the specified {@code File} with the systems default text editor. If operation fails + * an error message is displayed with the option to copy the absolute file path to clipboard. + * + * @param file the File instance of the log file + * @return did the file open successfully? + */ + public static boolean openLocalFile(final File file) + { + if (file == null || !file.exists()) + { + return false; + } + + if (attemptOpenLocalFile(file)) + { + log.debug("Opened log file through Desktop#open to {}", file); + return true; + } + + showMessageBox("Unable to open file. Press 'OK' and the file path will be copied to your clipboard", file.getAbsolutePath()); + return false; + } + + private static boolean attemptOpenLocalFile(final File file) + { + if (!Desktop.isDesktopSupported()) + { + return false; + } + + final Desktop desktop = Desktop.getDesktop(); + + if (!desktop.isSupported(Desktop.Action.OPEN)) + { + return false; + } + + try + { + desktop.open(file); + return true; + } + catch (IOException ex) + { + log.warn("Failed to open Desktop#open {}", file, ex); + return false; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java b/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java index 877c98b3d2..3380cf5a8f 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/PvPUtil.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2021, ThatGamerBlue + * Copyright (c) 2019, PKLite + * Copyright (c) 2020, ThatGamerBlue * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 5f226a40c9..1f33ce9638 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -40,6 +40,7 @@ import java.awt.TrayIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; +import java.lang.reflect.InvocationTargetException; import java.util.Enumeration; import java.util.function.BiConsumer; import javax.annotation.Nonnull; @@ -302,4 +303,19 @@ public class SwingUtil l.enter(); } } + + /** + * Executes a runnable on the EDT, blocking until it finishes. + */ + public static void syncExec(final Runnable r) throws InvocationTargetException, InterruptedException + { + if (EventQueue.isDispatchThread()) + { + r.run(); + } + else + { + EventQueue.invokeAndWait(r); + } + } } diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externalmanager_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externalmanager_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externalmanager_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externalmanager_icon.png diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/add_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/add_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_icon.png diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/add_raw_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_raw_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/add_raw_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_raw_icon.png diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/delete_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/delete_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/delete_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/delete_icon.png diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/discord_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/discord_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/discord_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/discord_icon.png diff --git a/runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/gh_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/gh_icon.png similarity index 100% rename from runelite-client/src/main/resources/com/openosrs/client/plugins/openosrs/externals/gh_icon.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/gh_icon.png diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 644a1346d3..cc74465b83 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1388,13 +1388,6 @@ public abstract class RSClientMixin implements RSClient @Replace("menuAction") static void copy$menuAction(int param0, int param1, int opcode, int id, String option, String target, int canvasX, int canvasY) { - boolean authentic = true; - if (target != null && target.startsWith("!AUTHENTIC")) - { - authentic = false; - target = target.substring(10); - } - /* Along the way, the RuneScape client may change a menuAction by incrementing it with 2000. * I have no idea why, but it does. Their code contains the same conditional statement. */ @@ -1403,17 +1396,13 @@ public abstract class RSClientMixin implements RSClient opcode -= 2000; } - final MenuOptionClicked menuOptionClicked = new MenuOptionClicked( - option, - target, - id, - opcode, - param0, - param1, - false, - authentic, - client.getMouseCurrentButton() - ); + final MenuOptionClicked menuOptionClicked = new MenuOptionClicked(); + menuOptionClicked.setActionParam(param0); + menuOptionClicked.setMenuOption(option); + menuOptionClicked.setMenuTarget(target); + menuOptionClicked.setMenuAction(MenuAction.of(opcode)); + menuOptionClicked.setId(id); + menuOptionClicked.setWidgetId(param1); client.getCallbacks().post(menuOptionClicked); @@ -1425,15 +1414,15 @@ public abstract class RSClientMixin implements RSClient if (printMenuActions) { client.getLogger().info( - "|MenuAction|: MenuOption={} MenuTarget={} Id={} Opcode={} Param0={} Param1={} CanvasX={} CanvasY={} Authentic={}", - menuOptionClicked.getOption(), menuOptionClicked.getTarget(), menuOptionClicked.getIdentifier(), - menuOptionClicked.getOpcode(), menuOptionClicked.getActionParam(), menuOptionClicked.getActionParam1(), - canvasX, canvasY, authentic + "|MenuAction|: MenuOption={} MenuTarget={} Id={} Opcode={} Param0={} Param1={} CanvasX={} CanvasY={}", + menuOptionClicked.getMenuOption(), menuOptionClicked.getMenuTarget(), menuOptionClicked.getId(), + menuOptionClicked.getMenuAction(), menuOptionClicked.getActionParam(), menuOptionClicked.getWidgetId(), + canvasX, canvasY ); } - copy$menuAction(menuOptionClicked.getActionParam(), menuOptionClicked.getActionParam1(), menuOptionClicked.getOpcode(), - menuOptionClicked.getIdentifier(), menuOptionClicked.getOption(), menuOptionClicked.getTarget(), canvasX, canvasY); + copy$menuAction(menuOptionClicked.getActionParam(), menuOptionClicked.getWidgetId(), menuOptionClicked.getMenuAction().getId(), + menuOptionClicked.getId(), menuOptionClicked.getMenuOption(), menuOptionClicked.getMenuTarget(), canvasX, canvasY); } @Override @@ -1442,7 +1431,7 @@ public abstract class RSClientMixin implements RSClient { assert isClientThread(); - client.sendMenuAction(param0, param1, opcode, identifier, option, "!AUTHENTIC" + target, 658, 384); + client.sendMenuAction(param0, param1, opcode, identifier, option, target, 658, 384); } @FieldHook("Login_username")