diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index c49cb897aa..0443812cbf 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -25,9 +25,9 @@ object ProjectVersions { const val launcherVersion = "2.2.0" - const val rlVersion = "1.8.7.1" + const val rlVersion = "1.8.8" - const val openosrsVersion = "4.17.1" + const val openosrsVersion = "4.17.2" const val rsversion = 202 const val cacheversion = 165 diff --git a/cache/src/main/java/net/runelite/cache/region/RegionLoader.java b/cache/src/main/java/net/runelite/cache/region/RegionLoader.java index 2dc3176678..a9656648d5 100644 --- a/cache/src/main/java/net/runelite/cache/region/RegionLoader.java +++ b/cache/src/main/java/net/runelite/cache/region/RegionLoader.java @@ -60,7 +60,6 @@ public class RegionLoader this.store = store; index = store.getIndex(IndexType.MAPS); keyManager = new XteaKeyManager(); - keyManager.loadKeys(); } public void loadRegions() throws IOException diff --git a/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java b/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java index 08ffbfb3ba..0db12a9193 100644 --- a/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java +++ b/cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java @@ -26,8 +26,6 @@ package net.runelite.cache.util; import java.util.HashMap; import java.util.Map; -import net.runelite.http.api.RuneLiteAPI; -import net.runelite.http.api.xtea.XteaClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,8 +37,6 @@ public class XteaKeyManager public void loadKeys() { - XteaClient xteaClient = new XteaClient(RuneLiteAPI.CLIENT); - keys = null; logger.info("Loaded {} keys", keys.size()); diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 9452be8d0d..85a02c0a69 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -25,8 +25,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --> + "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" + "https://checkstyle.org/dtds/configuration_1_3.dtd"> diff --git a/http-api/http-api.gradle.kts b/http-api/http-api.gradle.kts index a3997728cc..6acef6f2ef 100644 --- a/http-api/http-api.gradle.kts +++ b/http-api/http-api.gradle.kts @@ -34,6 +34,7 @@ dependencies { implementation(group = "com.google.code.gson", name = "gson", version = "2.8.5") implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "com.google.inject", name = "guice", version = "5.0.1") implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.1") implementation(group = "org.apache.commons", name = "commons-csv", version = "1.9.0") implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") diff --git a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java index 745474880a..08f6812c07 100644 --- a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java +++ b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java @@ -51,17 +51,12 @@ public class RuneLiteAPI public static final String RUNELITE_AUTH = "RUNELITE-AUTH"; public static final String RUNELITE_MACHINEID = "RUNELITE-MACHINEID"; - public static final OkHttpClient CLIENT; + public static OkHttpClient CLIENT; public static final Gson GSON; public static final MediaType JSON = MediaType.parse("application/json"); public static String userAgent; private static final String BASE = "https://api.runelite.net"; - private static final String WSBASE = "https://api.runelite.net/ws"; - private static final String STATICBASE = "https://static.runelite.net"; - - private static final String OPENOSRS_SESSION = "https://session.openosrs.dev"; - private static final String OPENOSRS_XTEA = "https://xtea.openosrs.dev"; private static final Properties properties = new Properties(); private static String version; @@ -123,11 +118,6 @@ public class RuneLiteAPI GSON = gsonBuilder.create(); } - public static HttpUrl getSessionBase() - { - return HttpUrl.parse(OPENOSRS_SESSION); - } - public static HttpUrl getApiBase() { final String prop = System.getProperty("runelite.http-service.url"); @@ -140,43 +130,9 @@ public class RuneLiteAPI return HttpUrl.parse(BASE + "/runelite-" + getVersion()); } - public static HttpUrl getStaticBase() - { - final String prop = System.getProperty("runelite.static.url"); - - if (prop != null && !prop.isEmpty()) - { - return HttpUrl.parse(prop); - } - - return HttpUrl.parse(STATICBASE); - } - - public static HttpUrl getWsEndpoint() - { - final String prop = System.getProperty("runelite.ws.url"); - - if (prop != null && !prop.isEmpty()) - { - return HttpUrl.parse(prop); - } - - return HttpUrl.parse(WSBASE); - } - - public static HttpUrl getXteaBase() - { - return HttpUrl.parse(OPENOSRS_XTEA); - } - public static String getVersion() { return version; } - public static void setVersion(String version) - { - RuneLiteAPI.version = version; - } - } diff --git a/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java b/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java index 2819c92ceb..b8afb20cec 100644 --- a/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java +++ b/http-api/src/main/java/net/runelite/http/api/ws/RuntimeTypeAdapterFactory.java @@ -187,9 +187,9 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { } final Map> labelToDelegate - = new LinkedHashMap>(); + = new LinkedHashMap>(); final Map, TypeAdapter> subtypeToDelegate - = new LinkedHashMap, TypeAdapter>(); + = new LinkedHashMap, TypeAdapter>(); for (Map.Entry> entry : labelToSubtype.entrySet()) { TypeAdapter delegate = gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); labelToDelegate.put(entry.getKey(), delegate); @@ -202,14 +202,14 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { JsonElement labelJsonElement = jsonElement.getAsJsonObject().remove(typeFieldName); if (labelJsonElement == null) { throw new JsonParseException("cannot deserialize " + baseType - + " because it does not define a field named " + typeFieldName); + + " because it does not define a field named " + typeFieldName); } String label = labelJsonElement.getAsString(); @SuppressWarnings("unchecked") // registration requires that subtype extends T TypeAdapter delegate = (TypeAdapter) labelToDelegate.get(label); if (delegate == null) { throw new JsonParseException("cannot deserialize " + baseType + " subtype named " - + label + "; did you forget to register a subtype?"); + + label + "; did you forget to register a subtype?"); } return delegate.fromJsonTree(jsonElement); } @@ -221,12 +221,12 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { TypeAdapter delegate = (TypeAdapter) subtypeToDelegate.get(srcType); if (delegate == null) { throw new JsonParseException("cannot serialize " + srcType.getName() - + "; did you forget to register a subtype?"); + + "; did you forget to register a subtype?"); } JsonObject jsonObject = delegate.toJsonTree(value).getAsJsonObject(); if (jsonObject.has(typeFieldName)) { throw new JsonParseException("cannot serialize " + srcType.getName() - + " because it already defines a field named " + typeFieldName); + + " because it already defines a field named " + typeFieldName); } JsonObject clone = new JsonObject(); clone.add(typeFieldName, new JsonPrimitive(label)); diff --git a/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java index f7672c9ca3..5c9cc34d92 100644 --- a/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java +++ b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java @@ -31,7 +31,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.List; -import lombok.AllArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; import static net.runelite.http.api.RuneLiteAPI.JSON; @@ -44,25 +45,30 @@ import okhttp3.RequestBody; import okhttp3.Response; @Slf4j -@AllArgsConstructor public class XteaClient { private final OkHttpClient client; + private final HttpUrl apiBase; + + @Inject + public XteaClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } public void submit(XteaRequest xteaRequest) { - String json = RuneLiteAPI.GSON.toJson(xteaRequest); - - HttpUrl url = RuneLiteAPI.getXteaBase().newBuilder() - .addPathSegment("xtea") - .build(); + HttpUrl url = apiBase.newBuilder() + .addPathSegment("xtea") + .build(); log.debug("Built URI: {}", url); Request request = new Request.Builder() - .post(RequestBody.create(JSON, json)) - .url(url) - .build(); + .post(RequestBody.create(JSON, RuneLiteAPI.GSON.toJson(xteaRequest))) + .url(url) + .build(); client.newCall(request).enqueue(new Callback() { @@ -75,7 +81,7 @@ public class XteaClient @Override public void onResponse(Call call, Response response) { - try + try // NOPMD: UseTryWithResources { if (!response.isSuccessful()) { @@ -92,13 +98,13 @@ public class XteaClient public List get() throws IOException { - HttpUrl url = RuneLiteAPI.getXteaBase().newBuilder() - .addPathSegment("xtea") - .build(); + HttpUrl url = apiBase.newBuilder() + .addPathSegment("xtea") + .build(); Request request = new Request.Builder() - .url(url) - .build(); + .url(url) + .build(); try (Response response = client.newCall(request).execute()) { @@ -115,14 +121,14 @@ public class XteaClient public XteaKey get(int region) throws IOException { - HttpUrl url = RuneLiteAPI.getXteaBase().newBuilder() - .addPathSegment("xtea") - .addPathSegment(Integer.toString(region)) - .build(); + HttpUrl url = apiBase.newBuilder() + .addPathSegment("xtea") + .addPathSegment(Integer.toString(region)) + .build(); Request request = new Request.Builder() - .url(url) - .build(); + .url(url) + .build(); try (Response response = client.newCall(request).execute()) { diff --git a/http-api/src/test/java/net/runelite/http/api/gson/ColorTypeAdapterTest.java b/http-api/src/test/java/net/runelite/http/api/gson/ColorTypeAdapterTest.java new file mode 100644 index 0000000000..0fe0b2226a --- /dev/null +++ b/http-api/src/test/java/net/runelite/http/api/gson/ColorTypeAdapterTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 Abex + * 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.http.api.gson; + +import java.awt.Color; +import net.runelite.http.api.RuneLiteAPI; +import org.junit.Assert; +import org.junit.Test; + +public class ColorTypeAdapterTest +{ + @Test + public void test() + { + test("null", null, true); + test("{\"value\":-13347208,\"falpha\":0.0}", new Color(0x12345678, false), false); + test("{\"value\":305419896,\"falpha\":0.0}", new Color(0x12345678, true), false); + test("{\"value\":-1.4221317E7,\"falpha\":0.0}", new Color(0xFF26FFFB, true), false); + test("\"#FF345678\"", new Color(0x12345678, false), true); + test("\"#12345678\"", new Color(0x12345678, true), true); + test("\"#FF26FFFB\"", new Color(0xFF26FFFB, true), true); + } + + private void test(String json, Color object, boolean exactEncoding) + { + Color parsed = RuneLiteAPI.GSON.fromJson(json, Color.class); + Assert.assertEquals(object, parsed); + String serialized = RuneLiteAPI.GSON.toJson(object); + if (exactEncoding) + { + Assert.assertEquals(json, serialized); + } + Color roundTripped = RuneLiteAPI.GSON.fromJson(serialized, Color.class); + Assert.assertEquals(object, roundTripped); + } +} \ No newline at end of file diff --git a/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java b/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java new file mode 100644 index 0000000000..f9ed850843 --- /dev/null +++ b/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Abex + * 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.http.api.gson; + +import java.time.Instant; +import net.runelite.http.api.RuneLiteAPI; +import org.junit.Assert; +import org.junit.Test; + +public class InstantTypeAdapterTest +{ + @Test + public void test() + { + test("null", null, true); + test("{\"seconds\":1609538310,\"nanos\":291000000}", Instant.ofEpochSecond(1609538310, 291_000_000), false); + test("1609538310291", Instant.ofEpochSecond(1609538310, 291_000_000), true); + } + + private void test(String json, Instant object, boolean exactEncoding) + { + Instant parsed = RuneLiteAPI.GSON.fromJson(json, Instant.class); + Assert.assertEquals(object, parsed); + String serialized = RuneLiteAPI.GSON.toJson(object); + if (exactEncoding) + { + Assert.assertEquals(json, serialized); + } + Instant roundTripped = RuneLiteAPI.GSON.fromJson(serialized, Instant.class); + Assert.assertEquals(object, roundTripped); + } +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 3416338a3b..b3feee5a7c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1114,7 +1114,9 @@ public interface Client extends GameEngine * Loads a model from the cache * * @param id the ID of the model + * @return the model or null if it is loading or nonexistent */ + @Nullable Model loadModel(int id); /** @@ -1123,7 +1125,9 @@ public interface Client extends GameEngine * @param id the ID of the model * @param colorToFind array of hsl color values to find in the model to replace * @param colorToReplace array of hsl color values to replace in the model + * @return the model or null if it is loading or nonexistent */ + @Nullable Model loadModel(int id, short[] colorToFind, short[] colorToReplace); /** diff --git a/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java index ba78add470..4b80d581f5 100644 --- a/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java +++ b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java @@ -54,4 +54,14 @@ public interface DecorativeObject extends TileObject * account for walls of varying widths. */ int getYOffset(); + + /** + * A bitfield containing various flags: + *
{@code
+	 * object type id = bits & 0x20
+	 * orientation (0-3) = bits >>> 6 & 3
+	 * supports items = bits >>> 8 & 1
+	 * }
+ */ + int getConfig(); } diff --git a/runelite-api/src/main/java/net/runelite/api/GameObject.java b/runelite-api/src/main/java/net/runelite/api/GameObject.java index 9cc903f621..67777f2987 100644 --- a/runelite-api/src/main/java/net/runelite/api/GameObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GameObject.java @@ -93,4 +93,14 @@ public interface GameObject extends TileObject * @see net.runelite.api.coords.Angle */ int getModelOrientation(); + + /** + * A bitfield containing various flags: + *
{@code
+	 * object type id = bits & 0x20
+	 * orientation (0-3) = bits >>> 6 & 3
+	 * supports items = bits >>> 8 & 1
+	 * }
+ */ + int getConfig(); } diff --git a/runelite-api/src/main/java/net/runelite/api/GroundObject.java b/runelite-api/src/main/java/net/runelite/api/GroundObject.java index 8732dfbf92..30b682553d 100644 --- a/runelite-api/src/main/java/net/runelite/api/GroundObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GroundObject.java @@ -42,4 +42,14 @@ public interface GroundObject extends TileObject * @see net.runelite.api.model.Jarvis */ Shape getConvexHull(); + + /** + * A bitfield containing various flags: + *
{@code
+	 * object type id = bits & 0x20
+	 * orientation (0-3) = bits >>> 6 & 3
+	 * supports items = bits >>> 8 & 1
+	 * }
+ */ + int getConfig(); } diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java index 2436c9ac3b..cc62a9e9ef 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java @@ -53,6 +53,12 @@ public interface ScriptEvent */ ScriptEvent setSource(Widget widget); + /** + * Arguments passed to the script. Index 0 is the script being run and is not an argument. + * @return + */ + Object[] getArguments(); + /** * Gets the menu index of the event * @@ -73,6 +79,11 @@ public interface ScriptEvent */ int getMouseX(); + /** + * Parent relative y coordinate for mouse related events + */ + int getMouseY(); + /** * Jagex typed keycode * diff --git a/runelite-api/src/main/java/net/runelite/api/WallObject.java b/runelite-api/src/main/java/net/runelite/api/WallObject.java index 94e1d09bc2..40c4e57457 100644 --- a/runelite-api/src/main/java/net/runelite/api/WallObject.java +++ b/runelite-api/src/main/java/net/runelite/api/WallObject.java @@ -27,37 +27,46 @@ package net.runelite.api; import java.awt.Shape; /** - * Represents the wall of a tile, which is an un-passable boundary. + * Represents one or two walls on a tile */ public interface WallObject extends TileObject { /** - * Gets the first orientation of the wall. - * - * @return the first orientation, 0-2048 where 0 is north + * A bitfield with the orientation of the first wall + * 1 = West + * 2 = North + * 4 = East + * 8 = South + * 16 = North-west + * 32 = North-east + * 64 = South-east + * 128 = South-west */ int getOrientationA(); /** - * Gets the second orientation value of the wall. - * - * @return the second orientation, 0-2048 where 0 is north + * A bitfield with the orientation of the second wall + * 1 = West + * 2 = North + * 4 = East + * 8 = South + * 16 = North-west + * 32 = North-east + * 64 = South-east + * 128 = South-west */ int getOrientationB(); /** - * Gets the boundary configuration of the wall. - * - * @return the boundary configuration + * A bitfield containing various flags: + *
{@code
+	 * object type id = bits & 0x20
+	 * orientation (0-3) = bits >>> 6 & 3
+	 * supports items = bits >>> 8 & 1
+	 * }
*/ int getConfig(); - Renderable getRenderable1(); - Renderable getRenderable2(); - - Model getModelA(); - Model getModelB(); - /** * Gets the convex hull of the objects model. * @@ -66,4 +75,10 @@ public interface WallObject extends TileObject */ Shape getConvexHull(); Shape getConvexHull2(); + + Renderable getRenderable1(); + Renderable getRenderable2(); + + Model getModelA(); + Model getModelB(); } diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index d24174feab..a41f1cc869 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -199,7 +199,7 @@ public class WorldPoint // get the template chunk for the chunk int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); - int templateChunk = instanceTemplateChunks[client.getPlane()][chunkX][chunkY]; + int templateChunk = instanceTemplateChunks[plane][chunkX][chunkY]; int rotation = templateChunk >> 1 & 0x3; int templateChunkY = (templateChunk >> 3 & 0x7FF) * CHUNK_SIZE; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index aa5c7b17a6..0c05ff3e1e 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -551,8 +551,8 @@ public enum WidgetInfo TRAILBLAZER_AREA_TELEPORT(WidgetID.TRAILBLAZER_AREAS_GROUP_ID, WidgetID.TrailblazerAreas.TELEPORT), MULTICOMBAT_FIXED(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MULTICOMBAT_INDICATOR), - MULTICOMBAT_RESIZEABLE_MODERN(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewport.MULTICOMBAT_INDICATOR), - MULTICOMBAT_RESIZEABLE_CLASSIC(WidgetID.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX_GROUP_ID, WidgetID.ResizableViewport.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), diff --git a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java index 7c696792ab..4f3ef00b79 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java @@ -38,7 +38,6 @@ import net.runelite.api.GameState; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ClientShutdown; import net.runelite.client.util.RunnableExceptionLogger; -import okhttp3.OkHttpClient; @Singleton @Slf4j @@ -54,11 +53,11 @@ public class ClientSessionManager @Inject ClientSessionManager(ScheduledExecutorService executorService, @Nullable Client client, - OkHttpClient okHttpClient) + SessionClient sessionClient) { this.executorService = executorService; this.client = client; - this.sessionClient = new SessionClient(okHttpClient); + this.sessionClient = sessionClient; } public void start() diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 96b5ed19b2..f62282759d 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -49,6 +49,7 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Locale; +import java.util.concurrent.TimeUnit; import java.util.Optional; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -91,6 +92,7 @@ import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldResult; import okhttp3.Cache; import okhttp3.OkHttpClient; +import okhttp3.Request; import okhttp3.Response; import org.slf4j.LoggerFactory; @@ -109,6 +111,7 @@ public class RuneLite public static final File DEFAULT_CONFIG_FILE = new File(RUNELITE_DIR, "settings.properties"); private static final int MAX_OKHTTP_CACHE_SIZE = 20 * 1024 * 1024; // 20mb + public static String USER_AGENT = "RuneLite/" + RuneLiteProperties.getVersion() + "-" + RuneLiteProperties.getCommit() + (RuneLiteProperties.isDirty() ? "+" : ""); @Getter private static Injector injector; @@ -273,16 +276,8 @@ public class RuneLite OpenOSRS.preload(); - OkHttpClient.Builder okHttpClientBuilder = RuneLiteAPI.CLIENT.newBuilder(); - setupCache(okHttpClientBuilder, new File(CACHE_DIR, "okhttp")); - - final boolean insecureSkipTlsVerification = options.has("insecure-skip-tls-verification"); - if (insecureSkipTlsVerification || RuneLiteProperties.isInsecureSkipTlsVerification()) - { - setupInsecureTrustManager(okHttpClientBuilder); - } - - final OkHttpClient okHttpClient = okHttpClientBuilder.build(); + final OkHttpClient okHttpClient = buildHttpClient(options.has("insecure-skip-tls-verification")); + RuneLiteAPI.CLIENT = okHttpClient; SplashScreen.init(); OpenOSRSSplashScreen.init(); @@ -532,9 +527,20 @@ public class RuneLite } @VisibleForTesting - static void setupCache(OkHttpClient.Builder builder, File cacheDir) + static OkHttpClient buildHttpClient(boolean insecureSkipTlsVerification) { - builder.cache(new Cache(cacheDir, MAX_OKHTTP_CACHE_SIZE)) + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .pingInterval(30, TimeUnit.SECONDS) + .addNetworkInterceptor(chain -> + { + Request userAgentRequest = chain.request() + .newBuilder() + .header("User-Agent", USER_AGENT) + .build(); + return chain.proceed(userAgentRequest); + }) + // Setup cache + .cache(new Cache(new File(CACHE_DIR, "okhttp"), MAX_OKHTTP_CACHE_SIZE)) .addNetworkInterceptor(chain -> { // This has to be a network interceptor so it gets hit before the cache tries to store stuff @@ -548,6 +554,13 @@ public class RuneLite } return res; }); + + if (insecureSkipTlsVerification || RuneLiteProperties.isInsecureSkipTlsVerification()) + { + setupInsecureTrustManager(builder); + } + + return builder.build(); } private static void setupInsecureTrustManager(OkHttpClient.Builder okHttpClientBuilder) 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 5d1f43b030..6a5a79dee5 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -25,6 +25,7 @@ package net.runelite.client; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.common.base.Strings; import com.google.gson.Gson; import com.google.inject.AbstractModule; import com.google.inject.Provides; @@ -41,6 +42,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import javax.annotation.Nullable; +import javax.inject.Named; import javax.inject.Singleton; import lombok.AllArgsConstructor; import net.runelite.api.Client; @@ -59,7 +61,7 @@ import net.runelite.client.task.Scheduler; import net.runelite.client.util.DeferredEventBus; import net.runelite.client.util.ExecutorServiceExceptionLogger; import net.runelite.http.api.RuneLiteAPI; -import net.runelite.http.api.chat.ChatClient; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @AllArgsConstructor @@ -135,10 +137,35 @@ public class RuneLiteModule extends AbstractModule } @Provides - @Singleton - ChatClient provideChatClient(OkHttpClient okHttpClient) + @Named("runelite.api.base") + HttpUrl provideApiBase(@Named("runelite.api.base") String s) { - return new ChatClient(okHttpClient); + final String prop = System.getProperty("runelite.http-service.url"); + return HttpUrl.get(Strings.isNullOrEmpty(prop) ? s : prop); + } + + @Provides + @Named("runelite.session") + HttpUrl provideSession(@Named("runelite.session") String s) + { + final String prop = System.getProperty("runelite.session.url"); + return HttpUrl.get(Strings.isNullOrEmpty(prop) ? s : prop); + } + + @Provides + @Named("runelite.static.base") + HttpUrl provideStaticBase(@Named("runelite.static.base") String s) + { + final String prop = System.getProperty("runelite.static.url"); + return HttpUrl.get(Strings.isNullOrEmpty(prop) ? s : prop); + } + + @Provides + @Named("runelite.ws") + HttpUrl provideWs(@Named("runelite.ws") String s) + { + final String prop = System.getProperty("runelite.ws.url"); + return HttpUrl.get(Strings.isNullOrEmpty(prop) ? s : prop); } @Provides diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java index c15287a263..d20808a68c 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java @@ -36,6 +36,8 @@ public class RuneLiteProperties { private static final String RUNELITE_TITLE = "runelite.title"; private static final String RUNELITE_VERSION = "runelite.version"; + private static final String RUNELITE_COMMIT = "runelite.commit"; + private static final String RUNELITE_DIRTY = "runelite.dirty"; private static final String DISCORD_INVITE = "runelite.discord.invite"; private static final String LAUNCHER_VERSION_PROPERTY = "runelite.launcher.version"; private static final String INSECURE_SKIP_TLS_VERIFICATION_PROPERTY = "runelite.insecure-skip-tls-verification"; @@ -46,6 +48,7 @@ public class RuneLiteProperties private static final String JAV_CONFIG_BACKUP = "runelite.jav_config_backup"; private static final String PLUGINHUB_BASE = "runelite.pluginhub.url"; private static final String PLUGINHUB_VERSION = "runelite.pluginhub.version"; + private static final String API_BASE = "runelite.api.base"; @Getter(AccessLevel.PACKAGE) private static final Properties properties = new Properties(); @@ -78,6 +81,16 @@ public class RuneLiteProperties return properties.getProperty(RUNELITE_VERSION); } + public static String getCommit() + { + return properties.getProperty(RUNELITE_COMMIT); + } + + public static boolean isDirty() + { + return Boolean.parseBoolean(properties.getProperty(RUNELITE_DIRTY)); + } + public static String getDiscordInvite() { return properties.getProperty(DISCORD_INVITE); @@ -124,4 +137,9 @@ public class RuneLiteProperties String version = System.getProperty(PLUGINHUB_VERSION, properties.getProperty(PLUGINHUB_VERSION)); return HttpUrl.parse(properties.get(PLUGINHUB_BASE) + "/" + version); } + + public static String getApiBase() + { + return properties.getProperty(API_BASE); + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/SessionClient.java b/runelite-client/src/main/java/net/runelite/client/SessionClient.java index 5ea3a116d3..2eb03084df 100644 --- a/runelite-client/src/main/java/net/runelite/client/SessionClient.java +++ b/runelite-client/src/main/java/net/runelite/client/SessionClient.java @@ -30,7 +30,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.UUID; -import lombok.AllArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -39,14 +40,21 @@ import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; -@AllArgsConstructor class SessionClient { - private final OkHttpClient okHttpClient; + private final OkHttpClient client; + private final HttpUrl sessionUrl; + + @Inject + private SessionClient(OkHttpClient client, @Named("runelite.session") HttpUrl sessionUrl) + { + this.client = client; + this.sessionUrl = sessionUrl; + } UUID open() throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = sessionUrl.newBuilder() .build(); Request request = new Request.Builder() @@ -54,10 +62,10 @@ class SessionClient .url(url) .build(); - try (Response response = okHttpClient.newCall(request).execute()) + try (Response response = client.newCall(request).execute()) { ResponseBody body = response.body(); - + InputStream in = body.byteStream(); return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in, StandardCharsets.UTF_8), UUID.class); } @@ -69,7 +77,7 @@ class SessionClient void ping(UUID uuid, boolean loggedIn) throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = sessionUrl.newBuilder() .addPathSegment("ping") .addQueryParameter("session", uuid.toString()) .addQueryParameter("logged-in", String.valueOf(loggedIn)) @@ -80,7 +88,7 @@ class SessionClient .url(url) .build(); - try (Response response = okHttpClient.newCall(request).execute()) + try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { @@ -91,7 +99,7 @@ class SessionClient void delete(UUID uuid) throws IOException { - HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() + HttpUrl url = sessionUrl.newBuilder() .addQueryParameter("session", uuid.toString()) .build(); @@ -100,6 +108,6 @@ class SessionClient .url(url) .build(); - okHttpClient.newCall(request).execute().close(); + client.newCall(request).execute().close(); } } diff --git a/http-api/src/main/java/net/runelite/http/api/account/AccountClient.java b/runelite-client/src/main/java/net/runelite/client/account/AccountClient.java similarity index 87% rename from http-api/src/main/java/net/runelite/http/api/account/AccountClient.java rename to runelite-client/src/main/java/net/runelite/client/account/AccountClient.java index ff999c6d71..4c26a60170 100644 --- a/http-api/src/main/java/net/runelite/http/api/account/AccountClient.java +++ b/runelite-client/src/main/java/net/runelite/client/account/AccountClient.java @@ -22,7 +22,7 @@ * (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.http.api.account; +package net.runelite.client.account; import com.google.gson.JsonParseException; import java.io.IOException; @@ -30,29 +30,36 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.UUID; -import lombok.RequiredArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.account.OAuthResponse; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @Slf4j -@RequiredArgsConstructor public class AccountClient { private final OkHttpClient client; + private final HttpUrl apiBase; + + @Setter private UUID uuid; - public void setUuid(UUID uuid) + @Inject + private AccountClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) { - this.uuid = uuid; + this.client = client; + this.apiBase = apiBase; } public OAuthResponse login() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("account") .addPathSegment("login") .addQueryParameter("uuid", uuid.toString()) @@ -77,7 +84,7 @@ public class AccountClient public void logout() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("account") .addPathSegment("logout") .build(); @@ -97,7 +104,7 @@ public class AccountClient public boolean sessionCheck() { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("account") .addPathSegment("session-check") .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java index 90c4c0c32d..7c7fb132a2 100644 --- a/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java @@ -47,10 +47,8 @@ import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionOpen; import net.runelite.client.util.LinkBrowser; import net.runelite.client.ws.WSClient; -import net.runelite.http.api.account.AccountClient; import net.runelite.http.api.account.OAuthResponse; import net.runelite.http.api.ws.messages.LoginResponse; -import okhttp3.OkHttpClient; @Singleton @Slf4j @@ -72,14 +70,14 @@ public class SessionManager ConfigManager configManager, EventBus eventBus, WSClient wsClient, - OkHttpClient okHttpClient, + AccountClient accountClient, Gson gson) { this.configManager = configManager; this.eventBus = eventBus; this.wsClient = wsClient; this.sessionFile = sessionfile; - this.accountClient = new AccountClient(okHttpClient); + this.accountClient = accountClient; this.gson = gson; eventBus.register(this); diff --git a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java index 3a650b0e85..6c1a9e7024 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java @@ -127,6 +127,10 @@ public class ClientThread implements Executor { ir.remove(); } + else + { + log.trace("Deferring task {}", r); + } } } } diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatClient.java similarity index 91% rename from http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java rename to runelite-client/src/main/java/net/runelite/client/chat/ChatClient.java index 06ca9bb623..2b599b47e0 100644 --- a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatClient.java @@ -22,7 +22,7 @@ * (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.http.api.chat; +package net.runelite.client.chat; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; @@ -32,22 +32,33 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Set; -import lombok.AllArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.chat.Duels; +import net.runelite.http.api.chat.LayoutRoom; +import net.runelite.http.api.chat.Task; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -@AllArgsConstructor public class ChatClient { private final OkHttpClient client; + private final HttpUrl apiBase; + + @Inject + private ChatClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } public boolean submitKc(String username, String boss, int kc) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("kc") .addQueryParameter("name", username) @@ -68,7 +79,7 @@ public class ChatClient public int getKc(String username, String boss) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("kc") .addQueryParameter("name", username) @@ -91,7 +102,7 @@ public class ChatClient public boolean submitQp(String username, int qp) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("qp") .addQueryParameter("name", username) @@ -111,7 +122,7 @@ public class ChatClient public int getQp(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("qp") .addQueryParameter("name", username) @@ -133,7 +144,7 @@ public class ChatClient public boolean submitTask(String username, String task, int amount, int initialAmount, String location) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("task") .addQueryParameter("name", username) @@ -156,7 +167,7 @@ public class ChatClient public Task getTask(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("task") .addQueryParameter("name", username) @@ -184,7 +195,7 @@ public class ChatClient public boolean submitPb(String username, String boss, double pb) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("pb") .addQueryParameter("name", username) @@ -205,7 +216,7 @@ public class ChatClient public double getPb(String username, String boss) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("pb") .addQueryParameter("name", username) @@ -228,7 +239,7 @@ public class ChatClient public boolean submitGc(String username, int gc) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("gc") .addQueryParameter("name", username) @@ -248,7 +259,7 @@ public class ChatClient public int getGc(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("gc") .addQueryParameter("name", username) @@ -270,7 +281,7 @@ public class ChatClient public boolean submitDuels(String username, int wins, int losses, int winningStreak, int losingStreak) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("duels") .addQueryParameter("name", username) @@ -293,7 +304,7 @@ public class ChatClient public Duels getDuels(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("duels") .addQueryParameter("name", username) @@ -321,7 +332,7 @@ public class ChatClient public boolean submitLayout(String username, LayoutRoom[] rooms) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("layout") .addQueryParameter("name", username) @@ -340,7 +351,7 @@ public class ChatClient public LayoutRoom[] getLayout(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("layout") .addQueryParameter("name", username) @@ -368,7 +379,7 @@ public class ChatClient public boolean submitPetList(String username, Collection petList) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("pets") .addQueryParameter("name", username) @@ -387,7 +398,7 @@ public class ChatClient public Set getPetList(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("chat") .addPathSegment("pets") .addQueryParameter("name", username) diff --git a/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigClient.java similarity index 91% rename from http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java rename to runelite-client/src/main/java/net/runelite/client/config/ConfigClient.java index b66b802399..a973d3c9a8 100644 --- a/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigClient.java @@ -22,7 +22,7 @@ * (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.http.api.config; +package net.runelite.client.config; import com.google.gson.Gson; import com.google.gson.JsonParseException; @@ -32,9 +32,12 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import lombok.AllArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.config.Configuration; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; @@ -44,7 +47,6 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -@AllArgsConstructor @Slf4j public class ConfigClient { @@ -52,11 +54,21 @@ public class ConfigClient private static final Gson GSON = RuneLiteAPI.GSON; private final OkHttpClient client; - private final UUID uuid; + private final HttpUrl apiBase; + + @Setter + private UUID uuid; + + @Inject + private ConfigClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } public Configuration get() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("config") .build(); @@ -82,7 +94,7 @@ public class ConfigClient { CompletableFuture future = new CompletableFuture<>(); - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("config") .addPathSegment(key) .build(); @@ -120,7 +132,7 @@ public class ConfigClient { CompletableFuture future = new CompletableFuture<>(); - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("config") .build(); @@ -173,7 +185,7 @@ public class ConfigClient { CompletableFuture future = new CompletableFuture<>(); - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("config") .addPathSegment(key) .build(); 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 37ab9c7c99..f42ef80efa 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 @@ -101,7 +101,6 @@ import net.runelite.client.events.RuneScapeProfileChanged; import net.runelite.client.plugins.OPRSExternalPluginManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.util.ColorUtil; -import net.runelite.http.api.config.ConfigClient; import net.runelite.http.api.config.ConfigEntry; import net.runelite.http.api.config.Configuration; import okhttp3.OkHttpClient; diff --git a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java index d101cc22bb..6bea4781c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java +++ b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java @@ -44,6 +44,7 @@ import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLiteProperties; import net.runelite.client.util.VerificationException; @@ -62,12 +63,17 @@ public class ExternalPluginClient { private final OkHttpClient okHttpClient; private final Gson gson; + private final HttpUrl apiBase; @Inject - private ExternalPluginClient(OkHttpClient okHttpClient, Gson gson) + private ExternalPluginClient(OkHttpClient okHttpClient, + Gson gson, + @Named("runelite.api.base") HttpUrl apiBase + ) { this.okHttpClient = okHttpClient; this.gson = gson; + this.apiBase = apiBase; } public List downloadManifest() throws IOException, VerificationException @@ -153,7 +159,7 @@ public class ExternalPluginClient return; } - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("pluginhub") .build(); @@ -181,7 +187,7 @@ public class ExternalPluginClient public Map getPluginCounts() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase() + HttpUrl url = apiBase .newBuilder() .addPathSegments("pluginhub") .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java b/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java index 1637f3a3fe..5578578015 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java @@ -38,9 +38,7 @@ import net.runelite.api.FriendsChatRank; import net.runelite.api.GameState; import net.runelite.api.IndexedSprite; import net.runelite.api.clan.ClanTitle; -import net.runelite.api.events.GameStateChanged; -import net.runelite.client.eventbus.EventBus; -import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.callback.ClientThread; import net.runelite.client.util.ImageUtil; @Singleton @@ -55,15 +53,23 @@ public class ChatIconManager private BufferedImage[] friendsChatRankImages; private BufferedImage[] clanRankImages; - private int friendsChatOffset; - private int clanOffset; + private int friendsChatOffset = -1; + private int clanOffset = -1; @Inject - private ChatIconManager(Client client, SpriteManager spriteManager, EventBus eventBus) + private ChatIconManager(Client client, SpriteManager spriteManager, ClientThread clientThread) { this.client = client; this.spriteManager = spriteManager; - eventBus.register(this); + clientThread.invokeLater(() -> + { + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + loadRankIcons(); + return true; + } + return false; + }); } @Nullable @@ -87,22 +93,13 @@ public class ChatIconManager public int getIconNumber(final FriendsChatRank friendsChatRank) { - return friendsChatOffset + friendsChatRank.ordinal() - 1; + return friendsChatOffset == -1 ? -1 : friendsChatOffset + friendsChatRank.ordinal() - 1; } public int getIconNumber(final ClanTitle clanTitle) { int rank = clanTitle.getId(); - return clanOffset + clanRankToIdx(rank); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) - { - if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN && friendsChatOffset == 0) - { - loadRankIcons(); - } + return clanOffset == -1 ? -1 : clanOffset + clanRankToIdx(rank); } private void loadRankIcons() diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/runelite-client/src/main/java/net/runelite/client/game/ItemClient.java similarity index 84% rename from http-api/src/main/java/net/runelite/http/api/item/ItemClient.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemClient.java index d9cf5c1665..0981093156 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemClient.java @@ -22,7 +22,7 @@ * (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.http.api.item; +package net.runelite.client.game; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; @@ -32,25 +32,39 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Map; -import lombok.AllArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.item.ItemPrice; +import net.runelite.http.api.item.ItemStats; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @Slf4j -@AllArgsConstructor public class ItemClient { private final OkHttpClient client; + private final HttpUrl apiBase, staticBase; + + @Inject + private ItemClient(OkHttpClient client, + @Named("runelite.api.base") HttpUrl apiBase, + @Named("runelite.static.base") HttpUrl staticBase + ) + { + this.client = client; + this.apiBase = apiBase; + this.staticBase = staticBase; + } public ItemPrice[] getPrices() throws IOException { - HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() - .addPathSegment("item") - .addPathSegment("prices.js"); + HttpUrl.Builder urlBuilder = apiBase.newBuilder() + .addPathSegment("item") + .addPathSegment("prices.js"); HttpUrl url = urlBuilder.build(); @@ -79,7 +93,7 @@ public class ItemClient public Map getStats() throws IOException { - HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() + HttpUrl.Builder urlBuilder = staticBase.newBuilder() .addPathSegment("item") // TODO: Change this to stats.min.json later after release is undeployed .addPathSegment("stats.ids.min.json"); diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index 3f112d6cc7..0c19310acc 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -56,10 +56,8 @@ import net.runelite.api.SpritePixels; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.util.AsyncBufferedImage; -import net.runelite.http.api.item.ItemClient; import net.runelite.http.api.item.ItemPrice; import net.runelite.http.api.item.ItemStats; -import okhttp3.OkHttpClient; @Singleton @Slf4j @@ -168,11 +166,11 @@ public class ItemManager @Inject public ItemManager(Client client, ScheduledExecutorService scheduledExecutorService, ClientThread clientThread, - OkHttpClient okHttpClient, RuneLiteConfig runeLiteConfig) + ItemClient itemClient, RuneLiteConfig runeLiteConfig) { this.client = client; this.clientThread = clientThread; - this.itemClient = new ItemClient(okHttpClient); + this.itemClient = itemClient; this.runeLiteConfig = runeLiteConfig; scheduledExecutorService.scheduleWithFixedDelay(this::loadPrices, 0, 30, TimeUnit.MINUTES); diff --git a/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java index 1a51afea3f..c1d182be38 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java @@ -32,21 +32,18 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import net.runelite.http.api.npc.NpcInfo; -import net.runelite.http.api.npc.NpcInfoClient; -import okhttp3.OkHttpClient; @Singleton @Slf4j public class NPCManager { - private final OkHttpClient okHttpClient; + private final NpcInfoClient npcInfoClient; private Map npcMap = Collections.emptyMap(); @Inject - private NPCManager(OkHttpClient okHttpClient, ScheduledExecutorService scheduledExecutorService) + private NPCManager(NpcInfoClient npcInfoClient, ScheduledExecutorService scheduledExecutorService) { - this.okHttpClient = okHttpClient; + this.npcInfoClient = npcInfoClient; scheduledExecutorService.execute(this::loadNpcs); } @@ -67,7 +64,7 @@ public class NPCManager { try { - npcMap = new NpcInfoClient(okHttpClient).getNpcs(); + npcMap = npcInfoClient.getNpcs(); } catch (IOException e) { diff --git a/http-api/src/main/java/net/runelite/http/api/npc/NpcInfo.java b/runelite-client/src/main/java/net/runelite/client/game/NpcInfo.java similarity index 97% rename from http-api/src/main/java/net/runelite/http/api/npc/NpcInfo.java rename to runelite-client/src/main/java/net/runelite/client/game/NpcInfo.java index 091f36e471..c33832c75c 100644 --- a/http-api/src/main/java/net/runelite/http/api/npc/NpcInfo.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NpcInfo.java @@ -22,7 +22,7 @@ * (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.http.api.npc; +package net.runelite.client.game; import lombok.Data; diff --git a/http-api/src/main/java/net/runelite/http/api/npc/NpcInfoClient.java b/runelite-client/src/main/java/net/runelite/client/game/NpcInfoClient.java similarity index 88% rename from http-api/src/main/java/net/runelite/http/api/npc/NpcInfoClient.java rename to runelite-client/src/main/java/net/runelite/client/game/NpcInfoClient.java index d7c4396625..aa625e4928 100644 --- a/http-api/src/main/java/net/runelite/http/api/npc/NpcInfoClient.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NpcInfoClient.java @@ -22,7 +22,7 @@ * (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.http.api.npc; +package net.runelite.client.game; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; @@ -32,7 +32,8 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Map; -import lombok.Value; +import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; @@ -41,14 +42,21 @@ import okhttp3.Request; import okhttp3.Response; @Slf4j -@Value public class NpcInfoClient { private final OkHttpClient client; + private final HttpUrl staticBase; + + @Inject + private NpcInfoClient(OkHttpClient client, @Named("runelite.static.base") HttpUrl staticBase) + { + this.client = client; + this.staticBase = staticBase; + } public Map getNpcs() throws IOException { - HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() + HttpUrl.Builder urlBuilder = staticBase.newBuilder() .addPathSegment("npcs") .addPathSegment("npcs.min.json"); diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java b/runelite-client/src/main/java/net/runelite/client/game/WorldClient.java similarity index 94% rename from http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java rename to runelite-client/src/main/java/net/runelite/client/game/WorldClient.java index d6e0865f14..9c0c442a0f 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java +++ b/runelite-client/src/main/java/net/runelite/client/game/WorldClient.java @@ -23,7 +23,7 @@ * (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.http.api.worlds; +package net.runelite.client.game; import com.google.gson.JsonParseException; import java.io.IOException; @@ -33,6 +33,7 @@ import java.nio.charset.StandardCharsets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.worlds.WorldResult; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -43,10 +44,11 @@ import okhttp3.Response; public class WorldClient { private final OkHttpClient client; + private final HttpUrl apiBase; public WorldResult lookupWorlds() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("worlds.js") .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/game/WorldService.java b/runelite-client/src/main/java/net/runelite/client/game/WorldService.java index 8f2a6a691b..8088b76829 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/WorldService.java +++ b/runelite-client/src/main/java/net/runelite/client/game/WorldService.java @@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import javax.annotation.Nullable; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -41,8 +42,8 @@ import net.runelite.client.eventbus.EventBus; import net.runelite.client.events.WorldsFetch; import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.http.api.worlds.World; -import net.runelite.http.api.worlds.WorldClient; import net.runelite.http.api.worlds.WorldResult; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @Singleton @@ -61,11 +62,11 @@ public class WorldService @Inject private WorldService(@Nullable Client client, ScheduledExecutorService scheduledExecutorService, OkHttpClient okHttpClient, - EventBus eventBus) + @Named("runelite.api.base") HttpUrl apiBase, EventBus eventBus) { this.client = client; this.scheduledExecutorService = scheduledExecutorService; - this.worldClient = new WorldClient(okHttpClient); + this.worldClient = new WorldClient(okHttpClient, apiBase); this.eventBus = eventBus; scheduledExecutorService.scheduleWithFixedDelay(RunnableExceptionLogger.wrap(this::tick), 0, WORLD_FETCH_TIMER, TimeUnit.MINUTES); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java index d1277b981d..7268e6aaf8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java @@ -632,18 +632,21 @@ public class ChatChannelPlugin extends Plugin if (rank != null && rank != FriendsChatRank.UNRANKED) { int iconNumber = chatIconManager.getIconNumber(rank); - final String img = ""; - if (message.getType() == ChatMessageType.FRIENDSCHAT) + if (iconNumber > -1) { - message.getMessageNode() - .setSender(message.getMessageNode().getSender() + " " + img); + final String img = ""; + if (message.getType() == ChatMessageType.FRIENDSCHAT) + { + message.getMessageNode() + .setSender(message.getMessageNode().getSender() + " " + img); + } + else + { + message.getMessageNode() + .setName(img + message.getMessageNode().getName()); + } + client.refreshChat(); } - else - { - message.getMessageNode() - .setName(img + message.getMessageNode().getName()); - } - client.refreshChat(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 4105a926a5..4973401812 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -73,6 +73,7 @@ import static net.runelite.api.widgets.WidgetID.DIARY_QUEST_GROUP_ID; import static net.runelite.api.widgets.WidgetID.KILL_LOGS_GROUP_ID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatClient; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageBuilder; @@ -93,7 +94,6 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.Text; -import net.runelite.http.api.chat.ChatClient; import net.runelite.http.api.chat.Duels; import net.runelite.http.api.item.ItemPrice; import okhttp3.OkHttpClient; diff --git a/http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedClient.java similarity index 86% rename from http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java rename to runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedClient.java index a0b628df33..f1b2506393 100644 --- a/http-api/src/main/java/net/runelite/http/api/feed/FeedClient.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedClient.java @@ -22,30 +22,39 @@ * (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.http.api.feed; +package net.runelite.client.plugins.feed; import com.google.gson.JsonParseException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import lombok.RequiredArgsConstructor; +import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.feed.FeedResult; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @Slf4j -@RequiredArgsConstructor public class FeedClient { private final OkHttpClient client; + private final HttpUrl apiBase; + + @Inject + private FeedClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } public FeedResult lookupFeed() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("feed.js") .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java index ebe607d986..f315f59374 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java @@ -45,9 +45,7 @@ import net.runelite.client.task.Schedule; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.ImageUtil; -import net.runelite.http.api.feed.FeedClient; import net.runelite.http.api.feed.FeedResult; -import okhttp3.OkHttpClient; @PluginDescriptor( name = "News Feed", @@ -145,10 +143,4 @@ public class FeedPlugin extends Plugin { return configManager.getConfig(FeedConfig.class); } - - @Provides - FeedClient provideFeedClient(OkHttpClient okHttpClient) - { - return new FeedClient(okHttpClient); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 062c810ffa..869ac73eef 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -44,9 +44,13 @@ import com.jogamp.opengl.GLFBODrawable; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.math.Matrix4; import java.awt.Canvas; +import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; @@ -293,6 +297,24 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int uniSmoothBanding; private int uniTextureLightMode; + private int needsReset; + + private final ComponentListener resizeListener = new ComponentAdapter() + { + @Override + public void componentResized(ComponentEvent e) + { + // forward to the JAWTWindow component listener on the canvas. The JAWTWindow component + // listener listens for resizes or movement of the component in order to resize and move + // the associated offscreen layer (calayer on macos only) + canvas.dispatchEvent(e); + // resetSize needs to be run awhile after the resize is completed. + // I've tried waiting until all EDT events are completed and even that is too soon. + // Not sure why, so we just wait a few frames. + needsReset = 5; + } + }; + @Override protected void startUp() { @@ -447,6 +469,12 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { invokeOnMainThread(this::uploadScene); } + + if (OSType.getOSType() == OSType.MacOS) + { + SwingUtilities.invokeAndWait(() -> ((Component) client).addComponentListener(resizeListener)); + needsReset = 5; // plugin startup races with ClientUI positioning, so do a reset in a little bit + } } catch (Throwable e) { @@ -474,6 +502,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks @Override protected void shutDown() { + ((Component) client).removeComponentListener(resizeListener); clientThread.invoke(() -> { client.setGpu(false); @@ -1091,16 +1120,22 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture); gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, canvasWidth, canvasHeight, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, null); gl.glBindTexture(gl.GL_TEXTURE_2D, 0); + } - if (OSType.getOSType() == OSType.MacOS && glDrawable instanceof GLFBODrawable) + if (needsReset > 0) + { + assert OSType.getOSType() == OSType.MacOS; + if (needsReset == 1 && glDrawable instanceof GLFBODrawable) { // GLDrawables created with createGLDrawable() do not have a resize listener // I don't know why this works with Windows/Linux, but on OSX // it prevents JOGL from resizing its FBOs and underlying GL textures. So, // we manually trigger a resize here. GLFBODrawable glfboDrawable = (GLFBODrawable) glDrawable; + log.debug("Resetting GLFBODrawable size"); glfboDrawable.resetSize(gl); } + needsReset--; } final BufferProvider bufferProvider = client.getBufferProvider(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeClient.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeClient.java new file mode 100644 index 0000000000..c50043ea80 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeClient.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2019, 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 net.runelite.client.plugins.grandexchange; + +import com.google.gson.Gson; +import java.io.IOException; +import java.util.UUID; +import javax.inject.Inject; +import javax.inject.Named; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.RuneLiteAPI; +import static net.runelite.http.api.RuneLiteAPI.JSON; +import net.runelite.http.api.ge.GrandExchangeTrade; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +@Slf4j +public class GrandExchangeClient +{ + private static final Gson GSON = RuneLiteAPI.GSON; + + private final OkHttpClient client; + private final HttpUrl apiBase; + + @Setter + private UUID uuid; + @Setter + private String machineId; + + @Inject + private GrandExchangeClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } + + public void submit(GrandExchangeTrade grandExchangeTrade) + { + final HttpUrl url = apiBase.newBuilder() + .addPathSegment("ge") + .build(); + + Request.Builder builder = new Request.Builder(); + if (uuid != null) + { + builder.header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()); + } + if (machineId != null) + { + builder.header(RuneLiteAPI.RUNELITE_MACHINEID, machineId); + } + + Request request = builder + .post(RequestBody.create(JSON, GSON.toJson(grandExchangeTrade))) + .url(url) + .build(); + + client.newCall(request).enqueue(new Callback() + { + @Override + public void onFailure(Call call, IOException e) + { + log.debug("unable to submit trade", e); + } + + @Override + public void onResponse(Call call, Response response) + { + log.debug("Submitted trade"); + response.close(); + } + }); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index 3728bad6dd..63f2c84669 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -100,11 +100,9 @@ import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.OSType; import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.Text; -import net.runelite.http.api.ge.GrandExchangeClient; import net.runelite.http.api.ge.GrandExchangeTrade; import net.runelite.http.api.item.ItemStats; import net.runelite.http.api.worlds.WorldType; -import okhttp3.OkHttpClient; import org.apache.commons.lang3.time.DurationFormatUtils; import org.apache.commons.text.similarity.FuzzyScore; @@ -259,12 +257,6 @@ public class GrandExchangePlugin extends Plugin return configManager.getConfig(GrandExchangeConfig.class); } - @Provides - GrandExchangeClient provideGrandExchangeClient(OkHttpClient okHttpClient) - { - return new GrandExchangeClient(okHttpClient); - } - @Override protected void startUp() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java index 662316eb93..25338d4285 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java @@ -800,7 +800,7 @@ public class GroundItemsPlugin extends Plugin Lootbeam lootbeam = lootbeams.get(worldPoint); if (lootbeam == null) { - lootbeam = new Lootbeam(client, worldPoint, color); + lootbeam = new Lootbeam(client, clientThread, worldPoint, color); lootbeams.put(worldPoint, lootbeam); } else diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/Lootbeam.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/Lootbeam.java index 1d95a39dc1..9e8761a93f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/Lootbeam.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/Lootbeam.java @@ -27,10 +27,12 @@ package net.runelite.client.plugins.grounditems; import net.runelite.api.AnimationID; import net.runelite.api.Client; import net.runelite.api.JagexColor; +import net.runelite.api.Model; import net.runelite.api.RuneLiteObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import java.awt.Color; +import net.runelite.client.callback.ClientThread; class Lootbeam { @@ -39,11 +41,13 @@ class Lootbeam private final RuneLiteObject runeLiteObject; private final Client client; + private final ClientThread clientThread; private Color color; - public Lootbeam(Client client, WorldPoint worldPoint, Color color) + public Lootbeam(Client client, ClientThread clientThread, WorldPoint worldPoint, Color color) { this.client = client; + this.clientThread = clientThread; runeLiteObject = client.createRuneLiteObject(); setColor(color); @@ -64,11 +68,21 @@ class Lootbeam } this.color = color; - runeLiteObject.setModel(client.loadModel( - RAID_LIGHT_MODEL, - new short[]{RAID_LIGHT_FIND_COLOR}, - new short[]{JagexColor.rgbToHSL(color.getRGB(), 1.0d)} - )); + clientThread.invoke(() -> + { + Model m = client.loadModel( + RAID_LIGHT_MODEL, + new short[]{RAID_LIGHT_FIND_COLOR}, + new short[]{JagexColor.rgbToHSL(color.getRGB(), 1.0d)} + ); + if (m == null) + { + return false; + } + + runeLiteObject.setModel(m); + return true; + }); } public void remove() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java index 8b189e57eb..807eb45413 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java @@ -79,7 +79,7 @@ enum WidgetOffset FIXED_2010_STATS_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_STATS_TAB, 41, 1, null, null), FIXED_2010_STATS_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 41, null, null, null), FIXED_2010_QUESTS_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_QUESTS_TAB, 75, 1, 33, null), - FIXED_2010_QUESTS_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 75, 0, null, null), + FIXED_2010_QUESTS_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 75, null, null, null), FIXED_2010_INVENTORY_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB, 109, 1, null, null), FIXED_2010_INVENTORY_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 111, -1, null, null), FIXED_2010_EQUIPMENT_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 143, 2, null, null), @@ -87,7 +87,7 @@ enum WidgetOffset FIXED_2010_PRAYER_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 178, 1, null, null), FIXED_2010_MAGIC_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_MAGIC_TAB, 211, 1, null, null), FIXED_2010_MAGIC_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 212, 1, null, null), - FIXED_2010_FRIENDS_CHAT_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_TAB, 0, 1, null, null), + FIXED_2010_FRIENDS_CHAT_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_TAB, null, 1, null, null), FIXED_2010_FRIENDS_CHAT_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_ICON, 5, null, null, null), FIXED_2010_FRIENDS_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_FRIENDS_TAB, 38, 1, 33, null), FIXED_2010_FRIENDS_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 40, null, null, null), @@ -102,17 +102,25 @@ enum WidgetOffset FIXED_2010_MUSIC_HIGHLIGHT(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_MUSIC_TAB, 208, 1, null, null), FIXED_2010_MUSIC_ICON(Skin.AROUND_2010, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 209, 2, null, null), - RESIZABLE_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_QUESTS_ICON, 72, 0, null, null), + RESIZABLE_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_QUESTS_ICON, 71, -1, null, null), RESIZABLE_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_LOGOUT_ICON, null, null, null, null), RESIZABLE_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_OPTIONS_ICON, 137, null, null, null), - RESIZABLE_2005_EMOTE_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_EMOTES_ICON, 173, 1, null, null), - RESIZABLE_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_ICON, null, -2, null, null), - RESIZABLE_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_EQUIPMENT_ICON, null, 2, null, null), + RESIZABLE_2005_EMOTE_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_EMOTES_ICON, 171, 2, null, null), + RESIZABLE_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_ICON, 103, 1, null, null), + RESIZABLE_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_EQUIPMENT_ICON, 136, 3, null, null), RESIZABLE_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_MUSIC_ICON, null, 3, null, null), + RESIZABLE_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_PRAYER_ICON, 169, -1, null, null), + RESIZABLE_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_STATS_ICON, 37, null, null, null), + RESIZABLE_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_FRIENDS_ICON, 38, null, null, null), - RESIZABLE_BOTTOM_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_ICON, 98, 2, null, null), - RESIZABLE_BOTTOM_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_QUESTS_ICON, 67, 0, null, null), - RESIZABLE_BOTTOM_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_EQUIPMENT_ICON, 132, 2, null, null), + RESIZABLE_BOTTOM_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_ICON, 98, 1, null, null), + RESIZABLE_BOTTOM_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_QUESTS_ICON, 66, -1, null, null), + RESIZABLE_BOTTOM_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_EQUIPMENT_ICON, 131, 3, null, null), + RESIZABLE_BOTTOM_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_MUSIC_ICON, null, 3, null, null), + RESIZABLE_BOTTOM_2005_EMOTE_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_EMOTES_ICON, 133, 1, null, null), + RESIZABLE_BOTTOM_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_STATS_ICON, 32, null, null, null), + RESIZABLE_BOTTOM_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_ICON, null, -1, null, null), + RESIZABLE_BOTTOM_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_COMBAT_ICON, 1, -1, null, null), FIXED_2005_ROOT_INTERFACE_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_ROOT_INTERFACE_CONTAINER, null, null, 197, null), FIXED_2005_INTERFACE_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, 7, null, null, null), @@ -128,11 +136,11 @@ enum WidgetOffset FIXED_2005_EQUIPMENT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_TAB, 153, 1, 30, null), FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 151, 4, null, null), FIXED_2005_PRAYER_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB, 181, null, 30, null), - FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 178, null, null, null), + FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 179, null, null, null), FIXED_2005_MAGIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_TAB, 209, 1, 30, null), - FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 2, null, null), + FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 3, null, null), FIXED_2005_FRIENDS_CHAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_TAB, 15, null, null, null), - FIXED_2005_FRIENDS_CHAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_ICON, 22, 0, null, null), + FIXED_2005_FRIENDS_CHAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_CHAT_ICON, 22, null, null, null), FIXED_2005_FRIENDS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_TAB, 51, null, 30, null), FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 49, -1, null, null), FIXED_2005_IGNORES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_TAB, 79, null, 30, null), @@ -144,7 +152,7 @@ enum WidgetOffset FIXED_2005_EMOTES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_TAB, 178, null, 30, null), FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 178, 1, null, null), FIXED_2005_MUSIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_TAB, 206, null, 30, null), - FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 5, null, null), + FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 2, null, null), FIXED_2006_ROOT_INTERFACE_CONTAINER(Skin.AROUND_2006, WidgetInfo.FIXED_VIEWPORT_ROOT_INTERFACE_CONTAINER, null, null, 197, null), FIXED_2006_INTERFACE_CONTAINER(Skin.AROUND_2006, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, 7, null, null, null), diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerClient.java similarity index 89% rename from http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java rename to runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerClient.java index 4fc68a6ba5..1f4d99c549 100644 --- a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerClient.java @@ -22,7 +22,7 @@ * (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.http.api.loottracker; +package net.runelite.client.plugins.loottracker; import com.google.gson.Gson; import com.google.gson.JsonParseException; @@ -35,12 +35,15 @@ import java.util.Collection; import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import javax.inject.Inject; +import javax.inject.Named; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; import static net.runelite.http.api.RuneLiteAPI.JSON; +import net.runelite.http.api.loottracker.LootAggregate; +import net.runelite.http.api.loottracker.LootRecord; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; @@ -50,21 +53,29 @@ import okhttp3.RequestBody; import okhttp3.Response; @Slf4j -@RequiredArgsConstructor public class LootTrackerClient { private static final Gson GSON = RuneLiteAPI.GSON; private final OkHttpClient client; + private final HttpUrl apiBase; + @Getter @Setter private UUID uuid; + @Inject + private LootTrackerClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) + { + this.client = client; + this.apiBase = apiBase; + } + public CompletableFuture submit(Collection lootRecords) { CompletableFuture future = new CompletableFuture<>(); - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("loottracker") .build(); @@ -107,7 +118,7 @@ public class LootTrackerClient public Collection get() throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("loottracker") .build(); @@ -137,7 +148,7 @@ public class LootTrackerClient public void delete(String eventId) { - HttpUrl.Builder builder = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl.Builder builder = apiBase.newBuilder() .addPathSegment("loottracker"); if (eventId != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index a3d500dc49..654d7db9b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -65,7 +65,6 @@ import net.runelite.client.util.ImageUtil; import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.SwingUtil; import net.runelite.http.api.loottracker.LootRecordType; -import net.runelite.http.api.loottracker.LootTrackerClient; class LootTrackerPanel extends PluginPanel { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index b29c67be58..056022045c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -114,8 +114,6 @@ import net.runelite.http.api.loottracker.GameItem; import net.runelite.http.api.loottracker.LootAggregate; import net.runelite.http.api.loottracker.LootRecord; import net.runelite.http.api.loottracker.LootRecordType; -import net.runelite.http.api.loottracker.LootTrackerClient; -import okhttp3.OkHttpClient; import org.apache.commons.text.WordUtils; @PluginDescriptor( @@ -340,12 +338,6 @@ public class LootTrackerPlugin extends Plugin return list; } - @Provides - LootTrackerClient provideLootTrackerClient(OkHttpClient okHttpClient) - { - return new LootTrackerClient(okHttpClient); - } - @Provides LootTrackerConfig provideConfig(ConfigManager configManager) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java index 4e980af0da..a8c67a0a56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java @@ -29,7 +29,6 @@ import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.events.BeforeRender; -import net.runelite.api.events.GameStateChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -57,10 +56,18 @@ public class LowMemoryPlugin extends Plugin @Override protected void startUp() { - if (client.getGameState() == GameState.LOGGED_IN) + clientThread.invoke(() -> { - clientThread.invoke(() -> client.changeMemoryMode(config.lowDetail())); - } + // When the client starts it initializes the texture size based on the memory mode setting. + // Don't set low memory before the login screen is ready to prevent loading the low detail textures, + // which breaks the gpu plugin due to it requiring the 128x128px textures + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + client.changeMemoryMode(config.lowDetail()); + return true; + } + return false; + }); } @Override @@ -80,19 +87,13 @@ public class LowMemoryPlugin extends Plugin { if (configChanged.getGroup().equals(LowMemoryConfig.GROUP)) { - clientThread.invoke(() -> client.changeMemoryMode(config.lowDetail())); - } - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - // When the client starts it initializes the texture size based on the memory mode setting. - // Don't set low memory before the login screen is ready to prevent loading the low detail textures, - // which breaks the gpu plugin due to it requiring the 128x128px textures - if (event.getGameState() == GameState.LOGIN_SCREEN) - { - client.changeMemoryMode(config.lowDetail()); + clientThread.invoke(() -> + { + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + client.changeMemoryMode(config.lowDetail()); + } + }); } } 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 6e740cc471..9893f002dc 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 @@ -128,7 +128,6 @@ public class MenuEntrySwapperPlugin extends Plugin MenuAction.ITEM_THIRD_OPTION, MenuAction.ITEM_FOURTH_OPTION, MenuAction.ITEM_FIFTH_OPTION, - MenuAction.EXAMINE_ITEM, MenuAction.ITEM_USE ); @@ -791,7 +790,7 @@ public class MenuEntrySwapperPlugin extends Plugin ItemComposition itemComposition = event.getItemComposition(); Integer option = getSwapConfig(true, itemComposition.getId()); - if (option != null) + if (option != null && option < itemComposition.getInventoryActions().length) { itemComposition.setShiftClickActionIndex(option); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 3cc468a39d..4722d85d85 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -67,6 +67,7 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.VarbitChanged; import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatClient; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageBuilder; @@ -96,7 +97,6 @@ import static net.runelite.client.util.Text.sanitize; import net.runelite.client.ws.PartyMember; import net.runelite.client.ws.PartyService; import net.runelite.client.ws.WSClient; -import net.runelite.http.api.chat.ChatClient; import net.runelite.http.api.chat.LayoutRoom; import net.runelite.http.api.ws.messages.party.PartyChatMessage; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfig.java index 39bf615853..4a32c41b36 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfig.java @@ -27,16 +27,32 @@ package net.runelite.client.plugins.roofremoval; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.ConfigSection; @ConfigGroup(RoofRemovalConfig.CONFIG_GROUP) public interface RoofRemovalConfig extends Config { String CONFIG_GROUP = "roofremoval"; + @ConfigSection( + name = "Modes", + description = "In what situations should roofs be removed", + position = 0 + ) + String modesSection = "modes"; + + @ConfigSection( + name = "Area Overrides", + description = "Always remove roofs in specific areas", + position = 1 + ) + String overridesSection = "overrides"; + @ConfigItem( keyName = "removePosition", name = "Player's position", - description = "Remove roofs above the player's position" + description = "Remove roofs above the player's position", + section = modesSection ) default boolean removePosition() { @@ -46,7 +62,8 @@ public interface RoofRemovalConfig extends Config @ConfigItem( keyName = "removeHovered", name = "Hovered tile", - description = "Remove roofs above the hovered tile" + description = "Remove roofs above the hovered tile", + section = modesSection ) default boolean removeHovered() { @@ -56,7 +73,8 @@ public interface RoofRemovalConfig extends Config @ConfigItem( keyName = "removeDestination", name = "Destination tile", - description = "Remove roofs above the destination tile" + description = "Remove roofs above the destination tile", + section = modesSection ) default boolean removeDestination() { @@ -66,10 +84,22 @@ public interface RoofRemovalConfig extends Config @ConfigItem( keyName = "removeBetween", name = "Between camera & player", - description = "Remove roofs between the camera and the player at low camera angles" + description = "Remove roofs between the camera and the player at low camera angles", + section = modesSection ) default boolean removeBetween() { return true; } + + @ConfigItem( + keyName = "overridePOH", + name = "Player Owned House", + description = "Always remove roofs while in the Player Owned House", + section = overridesSection + ) + default boolean overridePOH() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfigOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfigOverride.java new file mode 100644 index 0000000000..478f61ee4b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalConfigOverride.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.roofremoval; + +import lombok.Getter; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; + +@Getter +enum RoofRemovalConfigOverride +{ + POH(RoofRemovalConfig::overridePOH, 7257, 7513, 7514, 7769, 7770, 8025, 8026); + + private final Predicate enabled; + private final List regions; + + RoofRemovalConfigOverride(Predicate enabled, Integer... regions) + { + this.enabled = enabled; + this.regions = Arrays.asList(regions); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalPlugin.java index 9f86d9a47e..5d567a90c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roofremoval/RoofRemovalPlugin.java @@ -34,8 +34,10 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -86,6 +88,7 @@ public class RoofRemovalPlugin extends Plugin private RoofRemovalConfig config; private final Map overrides = new HashMap<>(); + private final Set configOverrideRegions = new HashSet<>(); @Provides RoofRemovalConfig getConfig(ConfigManager configManager) @@ -96,6 +99,7 @@ public class RoofRemovalPlugin extends Plugin @Override public void startUp() throws IOException { + buildConfigOverrides(); loadRoofOverrides(); clientThread.invoke(() -> { @@ -139,7 +143,21 @@ public class RoofRemovalPlugin extends Plugin return; } - client.getScene().setRoofRemovalMode(buildRoofRemovalFlags()); + if (e.getKey().startsWith("remove")) + { + client.getScene().setRoofRemovalMode(buildRoofRemovalFlags()); + } + else if (e.getKey().startsWith("override")) + { + buildConfigOverrides(); + clientThread.invoke(() -> + { + if (client.getGameState() == GameState.LOGGED_IN) + { + client.setGameState(GameState.LOADING); + } + }); + } } private int buildRoofRemovalFlags() @@ -164,6 +182,18 @@ public class RoofRemovalPlugin extends Plugin return roofRemovalMode; } + private void buildConfigOverrides() + { + configOverrideRegions.clear(); + for (RoofRemovalConfigOverride configOverride : RoofRemovalConfigOverride.values()) + { + if (configOverride.getEnabled().test(config)) + { + configOverrideRegions.addAll(configOverride.getRegions()); + } + } + } + private void performRoofRemoval() { assert client.isClientThread(); @@ -218,6 +248,11 @@ public class RoofRemovalPlugin extends Plugin outer: for (int regionID : client.getMapRegions()) { + if (configOverrideRegions.contains(regionID)) + { + regionsHaveOverrides = true; + break; + } for (int z = 0; z < Constants.MAX_Z; z++) { if (overrides.containsKey(regionID << 2 | z)) @@ -250,19 +285,21 @@ public class RoofRemovalPlugin extends Plugin // Properly account for instances shifting worldpoints around final WorldPoint wp = WorldPoint.fromLocalInstance(client, tile.getLocalLocation(), tile.getPlane()); - int regionID = wp.getRegionID() << 2 | z; - if (!overrides.containsKey(regionID)) - { - continue; - } - - int rx = wp.getRegionX(); - int ry = wp.getRegionY(); - long[] region = overrides.get(regionID); - if ((region[ry] & (1L << rx)) != 0) + int regionAndPlane = wp.getRegionID() << 2 | wp.getPlane(); + if (configOverrideRegions.contains(wp.getRegionID())) { settings[z][x][y] |= Constants.TILE_FLAG_UNDER_ROOF; } + else if (overrides.containsKey(regionAndPlane)) + { + int rx = wp.getRegionX(); + int ry = wp.getRegionY(); + long[] region = overrides.get(regionAndPlane); + if ((region[ry] & (1L << rx)) != 0) + { + settings[z][x][y] |= Constants.TILE_FLAG_UNDER_ROOF; + } + } } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 41598f00c4..3b35670873 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -74,6 +74,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatClient; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageBuilder; @@ -91,7 +92,6 @@ import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.ColorUtil; import net.runelite.client.util.Text; -import net.runelite.http.api.chat.ChatClient; import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index cfe7714b5e..36b11e2823 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -488,17 +488,14 @@ public class WorldMapPlugin extends Plugin } // Must setup the quest icons on the client thread, after the player has logged in. - clientThread.invokeLater(() -> + clientThread.invoke(() -> { - if (client.getGameState() != GameState.LOGGED_IN) + if (client.getGameState() == GameState.LOGGED_IN) { - return false; + Arrays.stream(QuestStartLocation.values()) + .map(this::createQuestStartPoint) + .forEach(worldMapPointManager::add); } - - Arrays.stream(QuestStartLocation.values()) - .map(this::createQuestStartPoint) - .forEach(worldMapPointManager::add); - return true; }); } diff --git a/http-api/src/main/java/net/runelite/http/api/xp/XpClient.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpClient.java similarity index 88% rename from http-api/src/main/java/net/runelite/http/api/xp/XpClient.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpClient.java index 76acf6ad63..d07cec417f 100644 --- a/http-api/src/main/java/net/runelite/http/api/xp/XpClient.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpClient.java @@ -22,11 +22,12 @@ * (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.http.api.xp; +package net.runelite.client.plugins.xptracker; import java.io.IOException; +import javax.inject.Inject; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; -import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; @@ -38,15 +39,18 @@ import okhttp3.Response; public class XpClient { private final OkHttpClient client; + private final HttpUrl apiBase; - public XpClient(OkHttpClient client) + @Inject + private XpClient(OkHttpClient client, @Named("runelite.api.base") HttpUrl apiBase) { this.client = client; + this.apiBase = apiBase; } public void update(String username) { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = apiBase.newBuilder() .addPathSegment("xp") .addPathSegment("update") .addQueryParameter("username", username) diff --git a/http-api/src/main/java/net/runelite/http/api/xp/XpData.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpData.java similarity index 100% rename from http-api/src/main/java/net/runelite/http/api/xp/XpData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpData.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 5407226a99..69ff78aa17 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -69,8 +69,6 @@ import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; -import net.runelite.http.api.xp.XpClient; -import okhttp3.OkHttpClient; @PluginDescriptor( name = "XP Tracker", @@ -139,12 +137,6 @@ public class XpTrackerPlugin extends Plugin return configManager.getConfig(XpTrackerConfig.class); } - @Provides - XpClient provideXpClient(OkHttpClient okHttpClient) - { - return new XpClient(okHttpClient); - } - @Override public void configure(Binder binder) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java index 4eae636114..1d08d64b04 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.xtea; -import com.google.inject.Provides; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; @@ -38,11 +37,10 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.http.api.xtea.XteaClient; import net.runelite.http.api.xtea.XteaKey; import net.runelite.http.api.xtea.XteaRequest; -import okhttp3.OkHttpClient; @PluginDescriptor( - name = "Xtea", - hidden = true + name = "Xtea", + hidden = true ) @Slf4j public class XteaPlugin extends Plugin @@ -55,12 +53,6 @@ public class XteaPlugin extends Plugin @Inject private XteaClient xteaClient; - @Provides - XteaClient provideXteaClient(OkHttpClient okHttpClient) - { - return new XteaClient(okHttpClient); - } - @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index 7b9d3f6091..aca456df93 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -78,7 +78,7 @@ import okhttp3.Response; public class ClientLoader implements Supplier { private static final String INJECTED_CLIENT_NAME = "/injected-client.oprs"; - private static final int NUM_ATTEMPTS = 0; + private static final int NUM_ATTEMPTS = 6; private static File LOCK_FILE = new File(RuneLite.CACHE_DIR, "cache.lock"); private static File VANILLA_CACHE = new File(RuneLite.CACHE_DIR, "vanilla.cache"); private static File PATCHED_CACHE = new File(RuneLite.CACHE_DIR, "patched.cache"); diff --git a/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java b/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java index 16cf8141ad..26b3139a64 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java @@ -35,9 +35,11 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.runelite.client.RuneLiteProperties; import net.runelite.http.api.worlds.World; -import net.runelite.http.api.worlds.WorldClient; +import net.runelite.client.game.WorldClient; import net.runelite.http.api.worlds.WorldType; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @Slf4j @@ -46,7 +48,7 @@ class WorldSupplier implements Supplier { private final OkHttpClient okHttpClient; private final Random random = new Random(System.nanoTime()); - private Queue worlds = new ArrayDeque<>(); + private final Queue worlds = new ArrayDeque<>(); @Override public World get() @@ -58,7 +60,7 @@ class WorldSupplier implements Supplier try { - List newWorlds = new WorldClient(okHttpClient) + List newWorlds = new WorldClient(okHttpClient, HttpUrl.get(RuneLiteProperties.getApiBase())) .lookupWorlds() .getWorlds() .stream() diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index b108080454..ae25265c3f 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -336,6 +336,12 @@ public class ClientUI frame.setResizable(true); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + if (OSType.getOSType() == OSType.MacOS) + { + // Change the default quit strategy to CLOSE_ALL_WINDOWS so that ctrl+q + // triggers the listener below instead of exiting. + MacOSQuitStrategy.setup(); + } frame.addWindowListener(new WindowAdapter() { @Override @@ -550,7 +556,11 @@ public class ClientUI // When Windows screen scaling is on, the position/bounds will be wrong when they are set. // The bounds saved in shutdown are the full, non-scaled co-ordinates. - if (scale != 1) + // On MacOS the scaling is already applied and the position/bounds are correct on at least + // - 2015 x64 MBP JDK11 Mohave + // - 2020 m1 MBP JDK17 Big Sur + // Adjusting the scaling further results in the client position being incorrect + if (scale != 1 && OSType.getOSType() != OSType.MacOS) { clientBounds.setRect( clientBounds.getX() / scale, diff --git a/runelite-client/src/main/java/net/runelite/client/ui/MacOSQuitStrategy.java b/runelite-client/src/main/java/net/runelite/client/ui/MacOSQuitStrategy.java new file mode 100644 index 0000000000..4c191ed3ca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/MacOSQuitStrategy.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, 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 net.runelite.client.ui; + +import com.apple.eawt.Application; +import com.apple.eawt.QuitStrategy; + +class MacOSQuitStrategy +{ + public static void setup() + { + try + { + // com.apple.eawt.QuitStrategy was moved to java.desktop in Java 9, + // but our OrangeExtensions API targets 1.6, so this code is only valid + // on 8 below. + Application.getApplication() + .setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS); + } + catch (NoClassDefFoundError ex) + { + // IntelliJ doesn't handle our multi-release Maven setup well, and will run + // this class on 11+. Ignore the error so the client can launch. + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java b/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java index 7f42fb4b29..4f3ae72c3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java @@ -31,7 +31,6 @@ import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import javax.annotation.Nullable; import javax.swing.ImageIcon; @@ -67,7 +66,7 @@ public class SplashScreen extends JFrame implements ActionListener private volatile String subActionText = ""; private volatile String progressText = null; - private SplashScreen() throws IOException + private SplashScreen() { BufferedImage logo = ImageUtil.loadImageResource(SplashScreen.class, "openosrs_transparent.png"); @@ -205,6 +204,12 @@ public class SplashScreen extends JFrame implements ActionListener } INSTANCE.timer.stop(); + // The CLOSE_ALL_WINDOWS quit strategy on MacOS dispatches WINDOW_CLOSING events to each frame + // from Window.getWindows. However, getWindows uses weak refs and relies on gc to remove windows + // from its list, causing events to get dispatched to disposed frames. The frames handle the events + // regardless of being disposed and will run the configured close operation. Set the close operation + // to DO_NOTHING_ON_CLOSE prior to disposing to prevent this. + INSTANCE.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); INSTANCE.dispose(); INSTANCE = null; }); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 93f71a5f90..57834bd4f3 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -71,8 +71,8 @@ public class WidgetOverlay extends Overlay new WidgetOverlay(client, WidgetInfo.VOLCANIC_MINE_VENTS_INFOBOX_GROUP, OverlayPosition.BOTTOM_RIGHT), new WidgetOverlay(client, WidgetInfo.VOLCANIC_MINE_STABILITY_INFOBOX_GROUP, OverlayPosition.BOTTOM_LEFT), new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_FIXED, OverlayPosition.BOTTOM_RIGHT), - new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_MODERN, OverlayPosition.CANVAS_TOP_RIGHT), - new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT), + new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZABLE_MODERN, OverlayPosition.CANVAS_TOP_RIGHT), + new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT), new WidgetOverlay(client, WidgetInfo.TEMPOROSS_STATUS_INDICATOR, OverlayPosition.TOP_LEFT), new WidgetOverlay(client, WidgetInfo.BA_HEAL_TEAMMATES, OverlayPosition.BOTTOM_LEFT), new WidgetOverlay(client, WidgetInfo.BA_TEAM, OverlayPosition.TOP_RIGHT), diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/outline/ModelOutlineRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/outline/ModelOutlineRenderer.java index 3047086dda..6f56546547 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/outline/ModelOutlineRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/outline/ModelOutlineRenderer.java @@ -1131,7 +1131,7 @@ public class ModelOutlineRenderer { drawModelOutline(model, lp.getX(), lp.getY(), Perspective.getTileHeight(client, lp, wallObject.getPlane()), - wallObject.getOrientationA(), outlineWidth, color, feather); + 0, outlineWidth, color, feather); } } @@ -1143,7 +1143,7 @@ public class ModelOutlineRenderer { drawModelOutline(model, lp.getX(), lp.getY(), Perspective.getTileHeight(client, lp, wallObject.getPlane()), - wallObject.getOrientationB(), outlineWidth, color, feather); + 0, outlineWidth, color, feather); } } } 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 22e46213e2..2e00dae0d6 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 @@ -187,6 +187,18 @@ public class SwingUtil @Override public void mouseClicked(MouseEvent e) { + if (OSType.getOSType() == OSType.MacOS) + { + // On macOS, frame.setVisible(true) only restores focus when the visibility was previously false. + // The frame's visibility is not set to false when the window loses focus, so we set it manually. + // Additionally, in order to bring the window to the foreground, + // frame.setVisible(true) calls CPlatformWindow::nativePushNSWindowToFront. + // However, this native method is not called with activateIgnoringOtherApps:YES, + // so any other active window will prevent our window from being brought to the front. + // To work around this, we use our macOS-specific requestForeground(). + frame.setVisible(false); + OSXUtil.requestForeground(); + } frame.setVisible(true); frame.setState(Frame.NORMAL); // Restore } diff --git a/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java b/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java index 88fc16abed..ea42605075 100644 --- a/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java +++ b/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java @@ -31,15 +31,17 @@ import java.util.HashSet; import java.util.Objects; import java.util.UUID; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.client.RuneLite; import net.runelite.client.eventbus.EventBus; -import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.ws.WebsocketGsonFactory; import net.runelite.http.api.ws.WebsocketMessage; import net.runelite.http.api.ws.messages.Handshake; import net.runelite.http.api.ws.messages.party.PartyMessage; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -52,6 +54,7 @@ public class WSClient extends WebSocketListener implements AutoCloseable { private final EventBus eventBus; private final OkHttpClient okHttpClient; + private final HttpUrl runeliteWs; private final Collection> messages = new HashSet<>(); private volatile Gson gson; @@ -60,10 +63,11 @@ public class WSClient extends WebSocketListener implements AutoCloseable private WebSocket webSocket; @Inject - private WSClient(EventBus eventBus, OkHttpClient okHttpClient) + private WSClient(EventBus eventBus, OkHttpClient okHttpClient, @Named("runelite.ws") HttpUrl runeliteWs) { this.eventBus = eventBus; this.okHttpClient = okHttpClient; + this.runeliteWs = runeliteWs; this.gson = WebsocketGsonFactory.build(WebsocketGsonFactory.factory(messages)); } @@ -101,8 +105,8 @@ public class WSClient extends WebSocketListener implements AutoCloseable } Request request = new Request.Builder() - .url(RuneLiteAPI.getWsEndpoint()) - .header("User-Agent", RuneLiteAPI.userAgent) + .url(runeliteWs) + .header("User-Agent", RuneLite.USER_AGENT) .build(); webSocket = okHttpClient.newWebSocket(request, this); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc index df0cc06c5e..04433ef5a0 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc @@ -3328,5 +3328,35 @@ "z1": 0, "z2": 0 } + ], + "7513": [ // POH styles 1-4 + { + "rx1": 24, + "ry1": 0, + "rx2": 31, + "ry2": 7, + "z1": 0, + "z2": 3 + } + ], + "7769": [ // POH styles 5-8 + { + "rx1": 24, + "ry1": 0, + "rx2": 31, + "ry2": 7, + "z1": 0, + "z2": 3 + } + ], + "8025": [ // POH styles 9-12 + { + "rx1": 24, + "ry1": 0, + "rx2": 31, + "ry2": 7, + "z1": 0, + "z2": 3 + } ] } diff --git a/runelite-client/src/main/resources/net/runelite/client/runelite.properties b/runelite-client/src/main/resources/net/runelite/client/runelite.properties index 15c74da46f..262089b836 100644 --- a/runelite-client/src/main/resources/net/runelite/client/runelite.properties +++ b/runelite-client/src/main/resources/net/runelite/client/runelite.properties @@ -2,7 +2,7 @@ runelite.title=OpenOSRS runelite.version=@project.version@ runescape.version=@rs.version@ runelite.discord.appid=627741263881568257 -runelite.discord.invite=https://discord.gg/r287wN6bkc +runelite.discord.invite=https://discord.gg/OpenOSRS runelite.github.link=https://github.com/open-osrs runelite.wiki.link=https://github.com/open-osrs/runelite/wiki runelite.patreon.link=https://www.patreon.com/openosrs @@ -13,4 +13,8 @@ runelite.jav_config=https://oldschool.runescape.com/jav_config.ws runelite.jav_config_backup=https://static.runelite.net/jav_config.ws runelite.pluginhub.url=https://repo.runelite.net/plugins runelite.pluginhub.version=@project.version@ -runelite.imgur.client.id=30d71e5f6860809 \ No newline at end of file +runelite.imgur.client.id=30d71e5f6860809 +runelite.api.base=https://api.runelite.net/runelite-@project.version@ +runelite.session=https://session.openosrs.dev +runelite.static.base=https://static.runelite.net +runelite.ws=https://api.runelite.net/ws \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/OkHttpCacheSanityTest.java b/runelite-client/src/test/java/net/runelite/client/OkHttpTest.java similarity index 89% rename from runelite-client/src/test/java/net/runelite/client/OkHttpCacheSanityTest.java rename to runelite-client/src/test/java/net/runelite/client/OkHttpTest.java index 2478042ed2..83032c4e5c 100644 --- a/runelite-client/src/test/java/net/runelite/client/OkHttpCacheSanityTest.java +++ b/runelite-client/src/test/java/net/runelite/client/OkHttpTest.java @@ -30,7 +30,6 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.concurrent.TimeUnit; -import net.runelite.http.api.RuneLiteAPI; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -38,11 +37,12 @@ import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import org.junit.Assert; +import static org.junit.Assert.assertTrue; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -public class OkHttpCacheSanityTest +public class OkHttpTest { @Rule public TemporaryFolder cacheFolder = new TemporaryFolder(); @@ -71,9 +71,7 @@ public class OkHttpCacheSanityTest @Test public void testCacheSanity() throws IOException, InterruptedException { - OkHttpClient.Builder builder = RuneLiteAPI.CLIENT.newBuilder(); - RuneLite.setupCache(builder, cacheFolder.getRoot()); - OkHttpClient client = builder.build(); + OkHttpClient client = RuneLite.buildHttpClient(false); Instant lastModified = Instant.now().minusSeconds(20); @@ -122,4 +120,19 @@ public class OkHttpCacheSanityTest Assert.assertNotNull("cache did not make a conditional request", req); Assert.assertNotNull(req.getHeader("If-Modified-Since")); } + + @Test + public void testUserAgent() throws IOException, InterruptedException + { + server.enqueue(new MockResponse().setBody("OK")); + + Request request = new Request.Builder() + .url(server.url("/")) + .build(); + RuneLite.buildHttpClient(false) + .newCall(request).execute().close(); + + // rest of UA depends on if git is found + assertTrue(server.takeRequest().getHeader("User-Agent").startsWith("RuneLite/" + RuneLiteProperties.getVersion())); + } } diff --git a/runelite-client/src/test/java/net/runelite/client/hiscore/HiscoreClientTest.java b/runelite-client/src/test/java/net/runelite/client/hiscore/HiscoreClientTest.java index fbc2e7b48f..e0b079e6b8 100644 --- a/runelite-client/src/test/java/net/runelite/client/hiscore/HiscoreClientTest.java +++ b/runelite-client/src/test/java/net/runelite/client/hiscore/HiscoreClientTest.java @@ -25,7 +25,7 @@ package net.runelite.client.hiscore; import java.io.IOException; -import net.runelite.http.api.RuneLiteAPI; +import okhttp3.OkHttpClient; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import static org.junit.Assert.assertEquals; @@ -132,7 +132,7 @@ public class HiscoreClientTest @Test public void testNormalLookup() throws Exception { - HiscoreClient hiscoreClient = new HiscoreClient(RuneLiteAPI.CLIENT); + HiscoreClient hiscoreClient = new HiscoreClient(new OkHttpClient()); HiscoreResult result = hiscoreClient.lookup("zezima", server.url("/")); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java index 8ac44d3a6a..918732d049 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java @@ -49,17 +49,18 @@ import net.runelite.api.widgets.Widget; import static net.runelite.api.widgets.WidgetID.ADVENTURE_LOG_ID; import static net.runelite.api.widgets.WidgetID.DIARY_QUEST_GROUP_ID; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.chat.ChatClient; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ChatColorConfig; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.RuneLiteConfig; +import net.runelite.client.game.ItemManager; import net.runelite.client.hiscore.HiscoreClient; import net.runelite.client.hiscore.HiscoreEndpoint; import net.runelite.client.hiscore.HiscoreResult; import net.runelite.client.hiscore.Skill; import net.runelite.http.api.RuneLiteAPI; -import net.runelite.http.api.chat.ChatClient; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; @@ -116,6 +117,10 @@ public class ChatCommandsPluginTest @Bind RuneLiteConfig runeLiteConfig; + @Mock + @Bind + ItemManager itemManager; + @Mock @Bind ChatCommandsConfig chatCommandsConfig; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java index b6139cc265..dd46f28550 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java @@ -51,7 +51,6 @@ import net.runelite.client.input.KeyManager; import net.runelite.client.input.MouseManager; import static net.runelite.client.plugins.grandexchange.GrandExchangePlugin.findFuzzyIndices; import static net.runelite.http.api.RuneLiteAPI.GSON; -import net.runelite.http.api.ge.GrandExchangeClient; import net.runelite.http.api.ge.GrandExchangeTrade; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java index cff8a46591..4f2288a136 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java @@ -61,7 +61,6 @@ import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.http.api.item.ItemPrice; import net.runelite.http.api.loottracker.LootRecordType; -import net.runelite.http.api.loottracker.LootTrackerClient; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import org.junit.Before; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index c9ebfba6f5..fcdc75db13 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -52,6 +52,7 @@ import net.runelite.api.events.StatChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; +import net.runelite.client.chat.ChatClient; import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; @@ -59,7 +60,6 @@ import net.runelite.client.game.ItemManager; import net.runelite.client.game.npcoverlay.NpcOverlayService; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import net.runelite.http.api.chat.ChatClient; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; @@ -142,6 +142,10 @@ public class SlayerPluginTest @Bind SlayerOverlay overlay; + @Mock + @Bind + TargetWeaknessOverlay targetWeaknessOverlay; + @Mock @Bind InfoBoxManager infoBoxManager; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java index a8dce5b513..977e379a9a 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java @@ -46,6 +46,7 @@ import net.runelite.client.Notifier; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ws.PartyService; +import net.runelite.client.ws.WSClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -81,6 +82,10 @@ public class SpecialCounterPluginTest @Bind private Notifier notifier; + @Mock + @Bind + private WSClient wsClient; + @Mock @Bind private SpecialCounterConfig specialCounterConfig;