From f2cdc8a1d8913a25617913b1eebbe8805de98c80 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Thu, 1 Aug 2019 03:03:57 -0700 Subject: [PATCH 1/5] menuentryswapper - Add volcanic mine entrance to swapQuick --- .../client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 480d11afe3..534b1447f2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -552,6 +552,7 @@ public class MenuEntrySwapperPlugin extends Plugin else if (config.swapQuick() && option.equals("climb-down")) { swap("quick-start", option, target, true); + swap("pay", option, target, true); } else if (config.swapAdmire() && option.equals("admire")) { From 905240b50ed481c750a13def96d6f4d79a3c1015 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Thu, 1 Aug 2019 12:25:28 +0100 Subject: [PATCH 2/5] idle notifier: notify when adding feathers or heads to shafts --- runelite-api/src/main/java/net/runelite/api/AnimationID.java | 2 ++ .../client/plugins/idlenotifier/IdleNotifierPlugin.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index 0ca4a11162..60aa84382e 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -71,6 +71,8 @@ public final class AnimationID public static final int FLETCHING_STRING_YEW_LONGBOW = 6688; public static final int FLETCHING_STRING_MAGIC_SHORTBOW = 6683; public static final int FLETCHING_STRING_MAGIC_LONGBOW = 6689; + public static final int FLETCHING_ATTACH_FEATHERS_TO_ARROWSHAFT = 8481; + public static final int FLETCHING_ATTACH_HEADS = 8480; public static final int GEM_CUTTING_OPAL = 890; public static final int GEM_CUTTING_JADE = 891; public static final int GEM_CUTTING_REDTOPAZ = 892; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index bf23010382..db2699d6d6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -154,7 +154,7 @@ public class IdleNotifierPlugin extends Plugin case CRAFTING_LEATHER: case CRAFTING_POTTERS_WHEEL: case CRAFTING_POTTERY_OVEN: - /* Fletching(Cutting, Stringing) */ + /* Fletching(Cutting, Stringing, Adding feathers and heads) */ case FLETCHING_BOW_CUTTING: case FLETCHING_STRING_NORMAL_SHORTBOW: case FLETCHING_STRING_OAK_SHORTBOW: @@ -168,6 +168,8 @@ public class IdleNotifierPlugin extends Plugin case FLETCHING_STRING_MAPLE_LONGBOW: case FLETCHING_STRING_YEW_LONGBOW: case FLETCHING_STRING_MAGIC_LONGBOW: + case FLETCHING_ATTACH_FEATHERS_TO_ARROWSHAFT: + case FLETCHING_ATTACH_HEADS: /* Smithing(Anvil, Furnace, Cannonballs */ case SMITHING_ANVIL: case SMITHING_SMELTING: From 3d326a6ee87293f08d537d2b246fdeaa799fa099 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 28 Jul 2019 12:34:01 -0400 Subject: [PATCH 3/5] client: cache and reuse Graphics --- .../net/runelite/api/MainBufferProvider.java | 2 +- .../net/runelite/client/callback/Hooks.java | 54 +++++++++++-------- .../client/ui/overlay/OverlayRenderer.java | 26 +++++---- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java index 33b3fea3f0..8d57b8efdc 100644 --- a/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java +++ b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java @@ -29,7 +29,7 @@ import java.awt.Image; /** * Represents the clients primary image buffer. */ -public interface MainBufferProvider +public interface MainBufferProvider extends BufferProvider { /** * Gets the image currently loaded in the buffer. diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 12de2c567b..96f4a90bbe 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -130,6 +130,31 @@ public class Hooks implements Callbacks private long lastCheck; private boolean shouldProcessGameTick; + private static MainBufferProvider lastMainBufferProvider; + private static Graphics2D lastGraphics; + + /** + * Get the Graphics2D for the MainBufferProvider image + * This caches the Graphics2D instance so it can be reused + * @param mainBufferProvider + * @return + */ + private static Graphics2D getGraphics(MainBufferProvider mainBufferProvider) + { + if (lastGraphics == null || lastMainBufferProvider != mainBufferProvider) + { + if (lastGraphics != null) + { + log.debug("Graphics reset!"); + lastGraphics.dispose(); + } + + lastMainBufferProvider = mainBufferProvider; + lastGraphics = (Graphics2D) mainBufferProvider.getImage().getGraphics(); + } + return lastGraphics; + } + @Override public void post(Object event) { @@ -295,9 +320,7 @@ public class Hooks implements Callbacks return; } - Image image = mainBufferProvider.getImage(); - final Image finalImage; - final Graphics2D graphics2d = (Graphics2D) image.getGraphics(); + final Graphics2D graphics2d = getGraphics(mainBufferProvider); try { @@ -313,8 +336,6 @@ public class Hooks implements Callbacks // Draw clientUI overlays clientUi.paintOverlays(graphics2d); - graphics2d.dispose(); - if (client.isGpu()) { // processDrawComplete gets called on GPU by the gpu plugin at the end of its @@ -323,6 +344,8 @@ public class Hooks implements Callbacks } // Stretch the game image if the user has that enabled + Image image = mainBufferProvider.getImage(); + final Image finalImage; if (client.isStretchedEnabled()) { GraphicsConfiguration gc = clientUi.getGraphicsConfiguration(); @@ -392,8 +415,7 @@ public class Hooks implements Callbacks public void drawScene() { MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); - BufferedImage image = (BufferedImage) bufferProvider.getImage(); - Graphics2D graphics2d = image.createGraphics(); + Graphics2D graphics2d = getGraphics(bufferProvider); try { @@ -403,18 +425,13 @@ public class Hooks implements Callbacks { log.warn("Error during overlay rendering", ex); } - finally - { - graphics2d.dispose(); - } } @Override public void drawAboveOverheads() { MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); - BufferedImage image = (BufferedImage) bufferProvider.getImage(); - Graphics2D graphics2d = image.createGraphics(); + Graphics2D graphics2d = getGraphics(bufferProvider); try { @@ -424,17 +441,12 @@ public class Hooks implements Callbacks { log.warn("Error during overlay rendering", ex); } - finally - { - graphics2d.dispose(); - } } public static void drawAfterWidgets() { MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); - BufferedImage image = (BufferedImage) bufferProvider.getImage(); - Graphics2D graphics2d = image.createGraphics(); + Graphics2D graphics2d = getGraphics(bufferProvider); try { @@ -445,10 +457,6 @@ public class Hooks implements Callbacks { log.warn("Error during overlay rendering", ex); } - finally - { - graphics2d.dispose(); - } // WidgetItemOverlays render at ABOVE_WIDGETS, reset widget item // list for next frame. diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 9e5820470a..a3dcd552f1 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -33,6 +33,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.awt.geom.AffineTransform; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; @@ -433,38 +434,45 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener private void safeRender(Client client, Overlay overlay, OverlayLayer layer, Graphics2D graphics, Point point) { - final Graphics2D subGraphics = (Graphics2D) graphics.create(); - if (!isResizeable && (layer == OverlayLayer.ABOVE_SCENE || layer == OverlayLayer.UNDER_WIDGETS)) { - subGraphics.setClip(client.getViewportXOffset(), + graphics.setClip(client.getViewportXOffset(), client.getViewportYOffset(), client.getViewportWidth(), client.getViewportHeight()); } + else + { + graphics.setClip(0, 0, client.getCanvasWidth(), client.getCanvasHeight()); + } final OverlayPosition position = overlay.getPosition(); // Set font based on configuration if (position == OverlayPosition.DYNAMIC || position == OverlayPosition.DETACHED) { - subGraphics.setFont(runeLiteConfig.fontType().getFont()); + graphics.setFont(runeLiteConfig.fontType().getFont()); } else if (position == OverlayPosition.TOOLTIP) { - subGraphics.setFont(runeLiteConfig.tooltipFontType().getFont()); + graphics.setFont(runeLiteConfig.tooltipFontType().getFont()); } else { - subGraphics.setFont(runeLiteConfig.interfaceFontType().getFont()); + graphics.setFont(runeLiteConfig.interfaceFontType().getFont()); } - subGraphics.translate(point.x, point.y); + // Reset the default color + graphics.setColor(Color.WHITE); + + // Get transform so we can reset it after drawing + AffineTransform transform = graphics.getTransform(); + graphics.translate(point.x, point.y); final Dimension overlayDimension; try { - overlayDimension = overlay.render(subGraphics); + overlayDimension = overlay.render(graphics); } catch (Exception ex) { @@ -473,7 +481,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } finally { - subGraphics.dispose(); + graphics.setTransform(transform); } final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension()); From c342f7391a7e56330d156b3db44085fbe68453a5 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 28 Jul 2019 12:56:54 -0400 Subject: [PATCH 4/5] client: cache config values --- .../config/ConfigInvocationHandler.java | 39 +++++++++++++++++-- .../runelite/client/config/ConfigManager.java | 4 ++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java index f2aa57ff3e..f6375b0bb8 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java @@ -24,6 +24,8 @@ */ package net.runelite.client.config; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; @@ -34,9 +36,15 @@ import lombok.extern.slf4j.Slf4j; @Slf4j class ConfigInvocationHandler implements InvocationHandler { - private final ConfigManager manager; + // Special object to represent null values in the cache + private static final Object NULL = new Object(); - public ConfigInvocationHandler(ConfigManager manager) + private final ConfigManager manager; + private final Cache cache = CacheBuilder.newBuilder() + .maximumSize(128) + .build(); + + ConfigInvocationHandler(ConfigManager manager) { this.manager = manager; } @@ -44,6 +52,16 @@ class ConfigInvocationHandler implements InvocationHandler @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + // Use cached configuration value if available + if (args == null) + { + Object cachedValue = cache.getIfPresent(method); + if (cachedValue != null) + { + return cachedValue == NULL ? null : cachedValue; + } + } + Class iface = proxy.getClass().getInterfaces()[0]; ConfigGroup group = iface.getAnnotation(ConfigGroup.class); @@ -63,6 +81,8 @@ class ConfigInvocationHandler implements InvocationHandler if (args == null) { + log.trace("cache miss (size: {}, group: {}, key: {})", cache.size(), group.value(), item.keyName()); + // Getting configuration item String value = manager.getConfiguration(group.value(), item.keyName()); @@ -70,9 +90,12 @@ class ConfigInvocationHandler implements InvocationHandler { if (method.isDefault()) { - return callDefaultMethod(proxy, method, null); + Object defaultValue = callDefaultMethod(proxy, method, null); + cache.put(method, defaultValue == null ? NULL : defaultValue); + return defaultValue; } + cache.put(method, NULL); return null; } @@ -81,7 +104,9 @@ class ConfigInvocationHandler implements InvocationHandler try { - return ConfigManager.stringToObject(value, returnType); + Object objectValue = ConfigManager.stringToObject(value, returnType); + cache.put(method, objectValue == null ? NULL : objectValue); + return objectValue; } catch (Exception e) { @@ -150,4 +175,10 @@ class ConfigInvocationHandler implements InvocationHandler .bindTo(proxy) .invokeWithArguments(args); } + + void invalidate() + { + log.trace("cache invalidate"); + cache.invalidateAll(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 8ff9434069..4e6c1e65ae 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -167,6 +167,7 @@ public class ConfigManager return; } + handler.invalidate(); properties.clear(); for (ConfigEntry entry : configuration.getConfig()) @@ -275,6 +276,7 @@ public class ConfigManager private synchronized void loadFromFile() { + handler.invalidate(); properties.clear(); try (FileInputStream in = new FileInputStream(propertiesFile)) @@ -391,6 +393,7 @@ public class ConfigManager } log.debug("Setting configuration value for {}.{} to {}", groupName, key, value); + handler.invalidate(); synchronized (pendingChanges) { @@ -421,6 +424,7 @@ public class ConfigManager } log.debug("Unsetting configuration value for {}.{}", groupName, key); + handler.invalidate(); synchronized (pendingChanges) { From 139b97920ef0b3ee3b78016c9e7b91f372384e50 Mon Sep 17 00:00:00 2001 From: Daniel Bolink Date: Fri, 2 Aug 2019 03:01:15 -0700 Subject: [PATCH 5/5] achievmentdiary: Update Ardougne Hard diary text (#9551) --- .../achievementdiary/diaries/ArdougneDiaryRequirement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java index e519510885..1772df73c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java @@ -87,7 +87,7 @@ public class ArdougneDiaryRequirement extends GenericDiaryRequirement new QuestRequirement(Quest.LEGENDS_QUEST)); add("Enter the Magic Guild.", new SkillRequirement(Skill.MAGIC, 66)); - add("Attempt to steal from King Lathas' chest.", + add("Attempt to steal from a chest in Ardougne Castle.", new SkillRequirement(Skill.THIEVING, 72)); add("Have a zookeeper put you in Ardougne Zoo's monkey cage.", new QuestRequirement(Quest.MONKEY_MADNESS_I, true));