diff --git a/build.gradle b/build.gradle index 3b00fb21cb..0fd170d5d6 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:deprecation" + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } } } @@ -39,8 +39,10 @@ subprojects { toolVersion = '6.4.1' sourceSets = [sourceSets.main] configFile = rootProject.file("./checkstyle/checkstyle.xml") + configProperties = [ "suppressionFile" : rootProject.file("./checkstyle/suppressions.xml")] showViolations = true ignoreFailures = false + maxWarnings = 0 } } diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java index e77964a5ca..923f781237 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ScriptLoader.java @@ -56,7 +56,7 @@ public class ScriptLoader int numSwitches = in.readUnsignedByte(); if (numSwitches > 0) { - Map[] switches = new Map[numSwitches]; + @SuppressWarnings("unchecked") Map[] switches = new Map[numSwitches]; def.setSwitches(switches); for (int i = 0; i < numSwitches; ++i) diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java index 15ec975d6d..3ce0bf4c3d 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/WorldMapLoader.java @@ -36,6 +36,7 @@ import net.runelite.cache.region.Position; public class WorldMapLoader { + @SuppressWarnings("unchecked") public WorldMapDefinition load(byte[] b, int fileId) { WorldMapDefinition def = new WorldMapDefinition(); diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java b/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java index 643057911e..85c37c4048 100644 --- a/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java +++ b/cache/src/main/java/net/runelite/cache/script/assembler/Assembler.java @@ -29,7 +29,7 @@ import java.io.InputStream; import net.runelite.cache.definitions.ScriptDefinition; import net.runelite.cache.script.Instructions; import net.runelite.cache.script.assembler.rs2asmParser.ProgContext; -import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; @@ -45,7 +45,7 @@ public class Assembler public ScriptDefinition assemble(InputStream in) throws IOException { // Get our lexer - rs2asmLexer lexer = new rs2asmLexer(new ANTLRInputStream(in)); + rs2asmLexer lexer = new rs2asmLexer(CharStreams.fromStream(in)); LexerErrorListener errorListener = new LexerErrorListener(); lexer.addErrorListener(errorListener); diff --git a/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java b/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java index 2797d4a4c6..60ebfb3369 100644 --- a/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java +++ b/cache/src/main/java/net/runelite/cache/script/assembler/ScriptWriter.java @@ -259,7 +259,7 @@ public class ScriptWriter extends rs2asmBaseListener } int index = 0; - Map[] maps = new Map[count]; + @SuppressWarnings("unchecked") Map[] maps = new Map[count]; for (LookupSwitch lswitch : switches) { if (lswitch == null) diff --git a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java index ec332656b2..a389e86139 100644 --- a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java @@ -24,6 +24,7 @@ */ package net.runelite.cache; +import com.google.common.io.FileWriteMode; import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -81,7 +82,7 @@ public class SoundEffectsDumperTest SoundEffectTrackLoader setLoader = new SoundEffectTrackLoader(); SoundEffectTrackDefinition soundEffect = setLoader.load(contents); - Files.write(gson.toJson(soundEffect), new File(dumpDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(dumpDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(soundEffect)); ++count; } } diff --git a/checkstyle.xml b/checkstyle.xml deleted file mode 100644 index c1935e18a2..0000000000 --- a/checkstyle.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml index 0a0c65e31e..449e5ab7d9 100644 --- a/checkstyle/checkstyle.xml +++ b/checkstyle/checkstyle.xml @@ -58,6 +58,6 @@ - + diff --git a/suppressions.xml b/checkstyle/suppressions.xml similarity index 100% rename from suppressions.xml rename to checkstyle/suppressions.xml diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeDynamic.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeDynamic.java index 6edced53b5..d191be1799 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeDynamic.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeDynamic.java @@ -66,6 +66,7 @@ public class InvokeDynamic extends Instruction implements InvokeInstruction } @Override + @SuppressWarnings("unchecked") public List getMethods() { return Collections.EMPTY_LIST; diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeSpecial.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeSpecial.java index 12befd9f0b..ea4e2a8254 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeSpecial.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeSpecial.java @@ -75,6 +75,7 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction } @Override + @SuppressWarnings("unchecked") public List getMethods() { return myMethod != null ? Arrays.asList(myMethod) : Collections.EMPTY_LIST; diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java index d1420adba5..f992fb6621 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java @@ -83,6 +83,7 @@ public class InvokeStatic extends Instruction implements InvokeInstruction } @Override + @SuppressWarnings("unchecked") public List getMethods() { return myMethod != null ? Arrays.asList(myMethod) : Collections.EMPTY_LIST; diff --git a/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java b/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java index 0885df774b..e55d5e6aeb 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java +++ b/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java @@ -70,6 +70,7 @@ public class MethodContext return contexts.get(i); } + @SuppressWarnings("unchecked") public Collection getInstructionContexts() { return (Collection) contexts.values(); diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java index 294a323d58..f9d99a380e 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java @@ -167,7 +167,7 @@ public class ModArith implements Deobfuscator FieldInfo fieldInfo = getFieldInfo(fi.getMyField()); - List l = getInsInExpr(ctx, new HashSet(), false); + @SuppressWarnings("unchecked") List l = getInsInExpr(ctx, new HashSet(), false); boolean other = false; // check if this contains another field boolean getter = false, setter = false; for (InstructionContext i : l) @@ -272,7 +272,7 @@ public class ModArith implements Deobfuscator // parse the full multiplication expression to // get all associated constants - List insInExpr = getInsInExpr(ctx, new HashSet(), true); + @SuppressWarnings("unchecked") List insInExpr = getInsInExpr(ctx, new HashSet(), true); for (InstructionContext ctx2 : insInExpr) { diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java index 735ea3c9a1..0970a9b3e1 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java @@ -171,6 +171,7 @@ public class ConstantParameter implements Deobfuscator findConstantParameter(methods, ins); } + @SuppressWarnings("unchecked") private List findParametersForMethod(Method m) { Collection c = mparams.get(m); diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java b/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java index ef586d7c5c..50a77f9a2d 100644 --- a/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java +++ b/deobfuscator/src/test/java/net/runelite/runeloader/CheckExports.java @@ -52,7 +52,7 @@ public class CheckExports @Before public void before() throws MalformedURLException, ClassNotFoundException { - ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURL()}); + ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURI().toURL()}); Class c = loader.loadClass("net.runelite.rs.client.client"); classes.add(c); @@ -70,6 +70,7 @@ public class CheckExports } } + @SuppressWarnings("unchecked") private Class findClassWithObfuscatedName(String name) { for (Class c : classes) diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java b/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java index 691067db31..06cd68abfc 100644 --- a/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java +++ b/deobfuscator/src/test/java/net/runelite/runeloader/CheckMappings.java @@ -53,7 +53,7 @@ public class CheckMappings @Before public void before() throws MalformedURLException, ClassNotFoundException { - ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURL()}); + ClassLoader loader = new URLClassLoader(new URL[]{CLIENT.toURI().toURL()}); Class c = loader.loadClass("client"); classes.add(c); @@ -71,6 +71,7 @@ public class CheckMappings } } + @SuppressWarnings("unchecked") private Class findClassWithObfuscatedName(String name) { for (Class c : classes) diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json b/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json index b97a00e3e3..62718d9cd2 100644 --- a/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json +++ b/deobfuscator/src/test/java/net/runelite/runesuite/hooks.json @@ -3673,7 +3673,7 @@ "descriptor" : "(ILdy;Ldy;I)V" } ] }, { - "class" : "GroundItem", + "class" : "TileItem", "name" : "ck", "super" : "ex", "access" : 49, @@ -3992,7 +3992,7 @@ "descriptor" : "()V" } ] }, { - "class" : "GroundItemPile", + "class" : "TileItemPile", "name" : "dr", "super" : "java.lang.Object", "access" : 49, @@ -10949,7 +10949,7 @@ "descriptor" : "I", "decoder" : 1192947815 }, { - "field" : "groundItemPile", + "field" : "tileItemPile", "owner" : "dj", "name" : "x", "access" : 0, diff --git a/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java b/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java index 7da50db2f4..fd79680edd 100644 --- a/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java +++ b/http-api/src/main/java/net/runelite/http/api/animation/AnimationClient.java @@ -57,8 +57,9 @@ public class AnimationClient logger.debug("Built URI: {}", url); + RequestBody body = RequestBody.Companion.create(json, JSON); Request request = new Request.Builder() - .post(RequestBody.create(JSON, json)) + .post(body) .url(url) .build(); diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java index 36cf0f84c3..19c4d1f81f 100644 --- a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java +++ b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java @@ -38,6 +38,8 @@ import okhttp3.Response; public class ChatClient { + + private static final RequestBody body = RequestBody.Companion.create(new byte[0], null); private static final Predicate LAYOUT_VALIDATOR = Pattern .compile("\\[[A-Z]+]:(\\s*\\w+\\s*(\\([A-Za-z]+\\))?,?)+") .asPredicate(); @@ -52,8 +54,9 @@ public class ChatClient .addQueryParameter("kc", Integer.toString(kc)) .build(); + Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -96,7 +99,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -141,7 +144,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -190,7 +193,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -233,7 +236,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -280,7 +283,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -303,7 +306,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -424,7 +427,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); @@ -453,7 +456,7 @@ public class ChatClient .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) + .post(body) .url(url) .build(); diff --git a/http-api/src/main/java/net/runelite/http/api/discord/DiscordClient.java b/http-api/src/main/java/net/runelite/http/api/discord/DiscordClient.java index 4f536b68ff..63a41be11d 100644 --- a/http-api/src/main/java/net/runelite/http/api/discord/DiscordClient.java +++ b/http-api/src/main/java/net/runelite/http/api/discord/DiscordClient.java @@ -52,8 +52,9 @@ public class DiscordClient private void message(HttpUrl url, DiscordMessage discordMessage, int retryAttempt, int maxAttempts) { + RequestBody body = RequestBody.Companion.create(gson.toJson(discordMessage), JSON); Request request = new Request.Builder() - .post(RequestBody.create(JSON, gson.toJson(discordMessage))) + .post(body) .url(url) .build(); diff --git a/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java b/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java index 5997799c2e..43096a61e1 100644 --- a/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java +++ b/http-api/src/main/java/net/runelite/http/api/examine/ExamineClient.java @@ -67,9 +67,10 @@ public class ExamineClient logger.debug("Built URI: {}", url); + RequestBody body = RequestBody.Companion.create(text, TEXT); Request request = new Request.Builder() .url(url) - .post(RequestBody.create(TEXT, text)) + .post(body) .build(); RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() diff --git a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java index a1b97bc390..f016468e92 100644 --- a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java +++ b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java @@ -53,9 +53,10 @@ public class GrandExchangeClient .addPathSegment("ge") .build(); + RequestBody body = RequestBody.Companion.create(GSON.toJson(grandExchangeTrade), JSON); Request request = new Request.Builder() .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) - .post(RequestBody.create(JSON, GSON.toJson(grandExchangeTrade))) + .post(body) .url(url) .build(); diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java index d250620905..ab7307b186 100644 --- a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java @@ -59,9 +59,10 @@ public class LootTrackerClient .addPathSegment("loottracker") .build(); + RequestBody body = RequestBody.Companion.create(GSON.toJson(lootRecord), JSON); Request request = new Request.Builder() .header(RuneLiteAPI.RUNELITE_AUTH, uuid.toString()) - .post(RequestBody.create(JSON, GSON.toJson(lootRecord))) + .post(body) .url(url) .build(); 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 d2bf09218c..c5d5b4c89a 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 @@ -57,8 +57,9 @@ public class XteaClient logger.debug("Built URI: {}", url); + RequestBody body = RequestBody.Companion.create(json, JSON); Request request = new Request.Builder() - .post(RequestBody.create(JSON, json)) + .post(body) .url(url) .build(); diff --git a/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java b/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java index 704e4f9cb2..841eb28eeb 100644 --- a/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java +++ b/http-service/src/main/java/net/runelite/http/service/SpringWebMvcConfigurer.java @@ -33,11 +33,11 @@ import org.springframework.http.converter.json.GsonHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc -public class SpringWebMvcConfigurer extends WebMvcConfigurerAdapter +public class SpringWebMvcConfigurer implements WebMvcConfigurer { /** * Configure .js as application/json to trick Cloudflare into caching json responses 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 76636acea7..d0f106a1c8 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -31,6 +31,7 @@ import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; @@ -350,6 +351,7 @@ public interface Client extends GameShell * @return the corresponding item composition * @see ItemID */ + @Nonnull ItemDefinition getItemDefinition(int id); /** @@ -1725,4 +1727,9 @@ public interface Client extends GameShell BigInteger getModulus(); void setModulus(BigInteger modulus); + + /* + * Returns the max item index + 1 from cache + */ + int getItemCount(); } diff --git a/runelite-api/src/main/java/net/runelite/api/Item.java b/runelite-api/src/main/java/net/runelite/api/Item.java index 811b02b0a4..8b762ca880 100644 --- a/runelite-api/src/main/java/net/runelite/api/Item.java +++ b/runelite-api/src/main/java/net/runelite/api/Item.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, Adam + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,23 +24,11 @@ */ package net.runelite.api; -/** - * Represents an item inside an {@link ItemContainer}. - */ -public interface Item extends Renderable +public interface Item { - /** - * Gets the items ID. - * - * @return the ID of the item - * @see ItemID - */ - int getId(); + int id = -1; + int quantity = -1; - /** - * Gets the items quantity. - * - * @return the items quantity - */ + int getId(); int getQuantity(); } diff --git a/runelite-api/src/main/java/net/runelite/api/Tile.java b/runelite-api/src/main/java/net/runelite/api/Tile.java index e33023c172..3707e4023f 100644 --- a/runelite-api/src/main/java/net/runelite/api/Tile.java +++ b/runelite-api/src/main/java/net/runelite/api/Tile.java @@ -130,7 +130,7 @@ public interface Tile * * @return the ground items */ - List getGroundItems(); + List getGroundItems(); /** * Return the tile under this one, if this tile is a bridge diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java b/runelite-api/src/main/java/net/runelite/api/TileItem.java similarity index 71% rename from runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java rename to runelite-api/src/main/java/net/runelite/api/TileItem.java index 109ea36f77..46a6262910 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IPHlpAPI.java +++ b/runelite-api/src/main/java/net/runelite/api/TileItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Adam + * Copyright (c) 2016-2017, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,19 +22,25 @@ * (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.worldhopper.ping; +package net.runelite.api; -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.Pointer; - -interface IPHlpAPI extends Library +/** + * Represents an item inside an {@link ItemLayer}. + */ +public interface TileItem extends Renderable { - IPHlpAPI INSTANCE = Native.loadLibrary("IPHlpAPI", IPHlpAPI.class); + /** + * Gets the items ID. + * + * @return the ID of the item + * @see ItemID + */ + int getId(); - Pointer IcmpCreateFile(); - - boolean IcmpCloseHandle(Pointer handle); - - int IcmpSendEcho(Pointer IcmpHandle, int DestinationAddress, Pointer RequestData, short RequestSize, Pointer RequestOptions, IcmpEchoReply ReplyBuffer, int ReplySize, int Timeout); + /** + * Gets the items quantity. + * + * @return the items quantity + */ + int getQuantity(); } diff --git a/runelite-api/src/main/java/net/runelite/api/VarClientInt.java b/runelite-api/src/main/java/net/runelite/api/VarClientInt.java index 27df154f62..55aee587ff 100644 --- a/runelite-api/src/main/java/net/runelite/api/VarClientInt.java +++ b/runelite-api/src/main/java/net/runelite/api/VarClientInt.java @@ -45,11 +45,24 @@ public enum VarClientInt INPUT_TYPE(5), MEMBERSHIP_STATUS(103), -/** - * -1 = player inventory closed - * 3 = player inventory opened -*/ - PLAYER_INVENTORY_OPENED(171), + + /** + * 0 = Combat + * 1 = Stats + * 2 = Quest + * 3 = Inventory + * 4 = Equipment + * 5 = Prayer + * 6 = Spellbook + * 7 = Clan + * 8 = Account Managment + * 9 = Friends + * 10 = Logout + * 11 = Options + * 12 = Emotes + * 13 = Music + */ + PLAYER_INTERFACE_CONTAINER_OPENED(171), INVENTORY_TAB(171), diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java index aeb90ede92..04016fe60a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java @@ -24,7 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.Item; +import lombok.Value; +import net.runelite.api.TileItem; import net.runelite.api.Tile; import lombok.Value; @@ -36,5 +37,5 @@ import lombok.Value; public class ItemDespawned { private final Tile tile; - private final Item item; + private final TileItem item; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java index 2cb1048f06..ec8bde0c5c 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java @@ -24,7 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.Item; +import lombok.Value; +import net.runelite.api.TileItem; import net.runelite.api.Tile; import lombok.Value; @@ -34,7 +35,7 @@ import lombok.Value; @Value public class ItemQuantityChanged { - private final Item item; + private final TileItem item; private final Tile tile; private final int oldQuantity; private final int newQuantity; diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java index eb41b3e530..39a183e2d2 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java @@ -24,7 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.Item; +import lombok.Value; +import net.runelite.api.TileItem; import net.runelite.api.Tile; import lombok.Value; @@ -36,5 +37,5 @@ import lombok.Value; public class ItemSpawned { private final Tile tile; - private final Item item; + private final TileItem item; } 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 69450219af..fa5457b348 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java @@ -35,6 +35,9 @@ import net.runelite.http.api.RuneLiteAPI; @Slf4j public class RuneLiteProperties { + private static final String DISCORD_APP_ID = "409416265891971072"; + private static final String DISCORD_APP_ID_PLUS = "560644885250572289"; + private final Properties properties = new Properties(); private final RuneLitePlusConfig runeLitePlusConfig; @@ -78,7 +81,19 @@ public class RuneLiteProperties public String getDiscordAppId() { - return "560644885250572289"; + if (this.runeLitePlusConfig == null) + { + return properties.getProperty(DISCORD_APP_ID); + } + + if (this.runeLitePlusConfig.customPresence()) + { + return properties.getProperty(DISCORD_APP_ID_PLUS); + } + else + { + return properties.getProperty(DISCORD_APP_ID); + } } public String getDiscordInvite() 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 505f5dca30..eaeebc8b82 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 @@ -43,7 +43,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.nio.channels.FileLock; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; @@ -108,7 +108,7 @@ public class ConfigManager final Properties properties = new Properties(); try (FileInputStream in = new FileInputStream(propertiesFile)) { - properties.load(new InputStreamReader(in, Charset.forName("UTF-8"))); + properties.load(new InputStreamReader(in, StandardCharsets.UTF_8)); } catch (Exception e) { @@ -116,7 +116,7 @@ public class ConfigManager return; } - final Map copy = (Map) ImmutableMap.copyOf(this.properties); + @SuppressWarnings("unchecked") final Map copy = (Map) ImmutableMap.copyOf(this.properties); copy.forEach((groupAndKey, value) -> { if (!properties.containsKey(groupAndKey)) @@ -160,7 +160,7 @@ public class ConfigManager try (FileInputStream in = new FileInputStream(SETTINGS_FILE)) { - properties.load(new InputStreamReader(in, Charset.forName("UTF-8"))); + properties.load(new InputStreamReader(in, StandardCharsets.UTF_8)); } catch (FileNotFoundException ex) { @@ -174,7 +174,7 @@ public class ConfigManager try { - Map copy = (Map) ImmutableMap.copyOf(properties); + @SuppressWarnings("unchecked") Map copy = (Map) ImmutableMap.copyOf(properties); copy.forEach((groupAndKey, value) -> { final String[] split = groupAndKey.split("\\.", 2); @@ -212,7 +212,7 @@ public class ConfigManager try { - properties.store(new OutputStreamWriter(out, Charset.forName("UTF-8")), "RuneLite configuration"); + properties.store(new OutputStreamWriter(out, StandardCharsets.UTF_8), "RuneLite configuration"); } finally { @@ -235,6 +235,7 @@ public class ConfigManager eventBus.post(ConfigChanged.class, configChanged); } + @SuppressWarnings("unchecked") public T getConfig(Class clazz) { if (!Modifier.isPublic(clazz.getModifiers())) @@ -263,6 +264,7 @@ public class ConfigManager return properties.getProperty(propertyKey); } + @SuppressWarnings("unchecked") public T getConfiguration(String groupName, String key, Class clazz) { String value = getConfiguration(groupName, key); @@ -464,6 +466,7 @@ public class ConfigManager } } + @SuppressWarnings("unchecked") static Object stringToObject(String str, Class type) { if (type == boolean.class || type == Boolean.class) @@ -633,22 +636,34 @@ public class ConfigManager newestFile = STANDARD_SETTINGS_FILE; - for (File profileDir : PROFILES_DIR.listFiles()) - { - if (!profileDir.isDirectory()) - { - continue; - } + File[] profileDirFiles = PROFILES_DIR.listFiles(); - for (File settings : profileDir.listFiles()) + if (profileDirFiles != null) + { + for (File profileDir : profileDirFiles) { - if (!settings.getName().equals(STANDARD_SETTINGS_FILE_NAME) || - settings.lastModified() < newestFile.lastModified()) + if (!profileDir.isDirectory()) { continue; } - newestFile = settings; + File[] settingsFiles = profileDir.listFiles(); + + if (settingsFiles == null) + { + continue; + } + + for (File settings : settingsFiles) + { + if (!settings.getName().equals(STANDARD_SETTINGS_FILE_NAME) || + settings.lastModified() < newestFile.lastModified()) + { + continue; + } + + newestFile = settings; + } } } 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 9a60cf848f..a6c0cd0067 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 @@ -43,6 +43,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; @@ -410,6 +411,7 @@ public class ItemManager * @param itemId item id * @return item composition */ + @Nonnull public ItemDefinition getItemDefinition(int itemId) { assert client.isClientThread() : "getItemDefinition must be called on client thread"; diff --git a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java index 2a6ad376de..15741e0872 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java @@ -38,7 +38,7 @@ import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.AnimationID; import net.runelite.api.Client; -import net.runelite.api.Item; +import net.runelite.api.TileItem; import net.runelite.api.ItemID; import net.runelite.api.NPC; import net.runelite.api.NpcID; @@ -163,7 +163,7 @@ public class LootManager private void onItemSpawned(ItemSpawned itemSpawned) { - final Item item = itemSpawned.getItem(); + final TileItem item = itemSpawned.getItem(); final Tile tile = itemSpawned.getTile(); final LocalPoint location = tile.getLocalLocation(); final int packed = location.getSceneX() << 8 | location.getSceneY(); @@ -173,14 +173,14 @@ public class LootManager private void onItemDespawned(ItemDespawned itemDespawned) { - final Item item = itemDespawned.getItem(); + final TileItem item = itemDespawned.getItem(); final LocalPoint location = itemDespawned.getTile().getLocalLocation(); log.debug("Item despawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location); } private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged) { - final Item item = itemQuantityChanged.getItem(); + final TileItem item = itemQuantityChanged.getItem(); final Tile tile = itemQuantityChanged.getTile(); final LocalPoint location = tile.getLocalLocation(); final int packed = location.getSceneX() << 8 | location.getSceneY(); diff --git a/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxItemSearch.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxItemSearch.java new file mode 100644 index 0000000000..fb60881e5a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxItemSearch.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2019, Ron Young + * 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.game.chatbox; + +import com.google.common.primitives.Ints; +import com.google.inject.Inject; +import java.awt.event.KeyEvent; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Consumer; +import javax.inject.Singleton; +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.ItemDefinition; +import net.runelite.api.widgets.ItemQuantityMode; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetSizeMode; +import net.runelite.api.widgets.WidgetTextAlignment; +import net.runelite.api.widgets.WidgetType; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.game.ItemManager; + +@Singleton +public class ChatboxItemSearch extends ChatboxTextInput +{ + private static final int ICON_HEIGHT = 32; + private static final int ICON_WIDTH = 36; + private static final int PADDING = 6; + private static final int MAX_RESULTS = 24; + private static final int FONT_SIZE = 16; + private static final int HOVERED_OPACITY = 128; + + private final ChatboxPanelManager chatboxPanelManager; + private final ItemManager itemManager; + private final Client client; + + private Map results = new LinkedHashMap<>(); + private String tooltipText; + private int index = -1; + + @Getter + private Consumer onItemSelected; + + @Inject + private ChatboxItemSearch(ChatboxPanelManager chatboxPanelManager, ClientThread clientThread, + ItemManager itemManager, Client client) + { + super(chatboxPanelManager, clientThread); + this.chatboxPanelManager = chatboxPanelManager; + this.itemManager = itemManager; + this.client = client; + + lines(1); + prompt("Item Search"); + onChanged(searchString -> + clientThread.invokeLater(() -> + { + filterResults(); + update(); + })); + } + + @Override + protected void update() + { + Widget container = chatboxPanelManager.getContainerWidget(); + container.deleteAllChildren(); + + Widget promptWidget = container.createChild(-1, WidgetType.TEXT); + promptWidget.setText(getPrompt()); + promptWidget.setTextColor(0x800000); + promptWidget.setFontId(getFontID()); + promptWidget.setOriginalX(0); + promptWidget.setOriginalY(5); + promptWidget.setXPositionMode(WidgetPositionMode.ABSOLUTE_CENTER); + promptWidget.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP); + promptWidget.setOriginalHeight(FONT_SIZE); + promptWidget.setXTextAlignment(WidgetTextAlignment.CENTER); + promptWidget.setYTextAlignment(WidgetTextAlignment.CENTER); + promptWidget.setWidthMode(WidgetSizeMode.MINUS); + promptWidget.revalidate(); + + buildEdit(0, 5 + FONT_SIZE, container.getWidth(), FONT_SIZE); + + Widget separator = container.createChild(-1, WidgetType.LINE); + separator.setOriginalX(0); + separator.setOriginalY(8 + (FONT_SIZE * 2)); + separator.setXPositionMode(WidgetPositionMode.ABSOLUTE_CENTER); + separator.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP); + separator.setOriginalHeight(0); + separator.setOriginalWidth(16); + separator.setWidthMode(WidgetSizeMode.MINUS); + separator.setTextColor(0x666666); + separator.revalidate(); + + int x = PADDING; + int y = PADDING * 3; + int idx = 0; + for (ItemDefinition itemDefinition : results.values()) + { + Widget item = container.createChild(-1, WidgetType.GRAPHIC); + item.setXPositionMode(WidgetPositionMode.ABSOLUTE_LEFT); + item.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP); + item.setOriginalX(x); + item.setOriginalY(y + FONT_SIZE * 2); + item.setOriginalHeight(ICON_HEIGHT); + item.setOriginalWidth(ICON_WIDTH); + item.setName("" + itemDefinition.getName()); + item.setItemId(itemDefinition.getId()); + item.setItemQuantity(10000); + item.setItemQuantityMode(ItemQuantityMode.NEVER); + item.setBorderType(1); + item.setAction(0, tooltipText); + item.setHasListener(true); + + if (index == idx) + { + item.setOpacity(HOVERED_OPACITY); + } + else + { + item.setOnMouseOverListener((JavaScriptCallback) ev -> item.setOpacity(HOVERED_OPACITY)); + item.setOnMouseLeaveListener((JavaScriptCallback) ev -> item.setOpacity(0)); + } + + item.setOnOpListener((JavaScriptCallback) ev -> + { + if (onItemSelected != null) + { + onItemSelected.accept(itemDefinition.getId()); + } + + chatboxPanelManager.close(); + }); + + x += ICON_WIDTH + PADDING; + if (x + ICON_WIDTH >= container.getWidth()) + { + y += ICON_HEIGHT + PADDING; + x = PADDING; + } + + item.revalidate(); + ++idx; + } + } + + @Override + public void keyPressed(KeyEvent ev) + { + switch (ev.getKeyCode()) + { + case KeyEvent.VK_ENTER: + ev.consume(); + if (index > -1) + { + if (onItemSelected != null) + { + onItemSelected.accept(results.keySet().toArray(new Integer[results.size()])[index]); + } + + chatboxPanelManager.close(); + } + break; + case KeyEvent.VK_TAB: + case KeyEvent.VK_RIGHT: + ev.consume(); + if (!results.isEmpty()) + { + index++; + if (index >= results.size()) + { + index = 0; + } + clientThread.invokeLater(this::update); + } + break; + case KeyEvent.VK_LEFT: + ev.consume(); + if (!results.isEmpty()) + { + index--; + if (index < 0) + { + index = results.size() - 1; + } + clientThread.invokeLater(this::update); + } + break; + case KeyEvent.VK_UP: + ev.consume(); + if (results.size() >= (MAX_RESULTS / 2)) + { + index -= MAX_RESULTS / 2; + if (index < 0) + { + if (results.size() == MAX_RESULTS) + { + index += results.size(); + } + else + { + index += MAX_RESULTS; + } + index = Ints.constrainToRange(index, 0, results.size() - 1); + } + + clientThread.invokeLater(this::update); + } + break; + case KeyEvent.VK_DOWN: + ev.consume(); + if (results.size() >= (MAX_RESULTS / 2)) + { + index += MAX_RESULTS / 2; + if (index >= MAX_RESULTS) + { + if (results.size() == MAX_RESULTS) + { + index -= results.size(); + } + else + { + index -= MAX_RESULTS; + } + index = Ints.constrainToRange(index, 0, results.size() - 1); + } + + clientThread.invokeLater(this::update); + } + break; + default: + super.keyPressed(ev); + } + } + + @Override + protected void close() + { + // Clear search string when closed + value(""); + results.clear(); + index = -1; + super.close(); + } + + @Override + @Deprecated + public ChatboxTextInput onDone(Consumer onDone) + { + throw new UnsupportedOperationException(); + } + + private void filterResults() + { + results.clear(); + index = -1; + + String search = getValue().toLowerCase(); + if (search.isEmpty()) + { + return; + } + + for (int i = 0; i < client.getItemCount() && results.size() < MAX_RESULTS; i++) + { + ItemDefinition itemComposition = itemManager.getItemDefinition(itemManager.canonicalize(i)); + String name = itemComposition.getName(); + // The client assigns "null" to item names of items it doesn't know about + if (!name.equals("null") && name.toLowerCase().contains(search)) + { + // This may already be in the map due to canonicalize mapping the item to something we've already seen + results.putIfAbsent(itemComposition.getId(), itemComposition); + } + } + } + + public ChatboxItemSearch onItemSelected(Consumer onItemSelected) + { + this.onItemSelected = onItemSelected; + return this; + } + + public ChatboxItemSearch tooltipText(final String text) + { + tooltipText = text; + return this; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java index 82973cecb1..108b33e929 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java +++ b/runelite-client/src/main/java/net/runelite/client/game/chatbox/ChatboxTextInput.java @@ -67,7 +67,7 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse private static final Pattern BREAK_MATCHER = Pattern.compile("[^a-zA-Z0-9']"); private final ChatboxPanelManager chatboxPanelManager; - private final ClientThread clientThread; + protected final ClientThread clientThread; private static IntPredicate getDefaultCharValidator() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index d3627aabe4..48a99e1629 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -118,6 +118,9 @@ public class PluginManager this.configManager = configManager; this.executor = executor; this.sceneTileManager = sceneTileManager; + + eventBus.subscribe(SessionOpen.class, this, this::onSessionOpen); + eventBus.subscribe(SessionClose.class, this, this::onSessionClose); } public void watch() @@ -171,7 +174,7 @@ public class PluginManager return null; } - public List getPluginConfigProxies() + private List getPluginConfigProxies() { List injectors = new ArrayList<>(); injectors.add(RuneLite.getInjector()); @@ -224,6 +227,7 @@ public class PluginManager } } + @SuppressWarnings("unchecked") List scanAndInstantiate(ClassLoader classLoader, String packageName) throws IOException { MutableGraph> graph = GraphBuilder @@ -266,7 +270,7 @@ public class PluginManager continue; } - Class pluginClass = (Class) clazz; + @SuppressWarnings("unchecked") Class pluginClass = (Class) clazz; graph.addNode(pluginClass); } @@ -428,13 +432,14 @@ public class PluginManager if (value != null) { - return Boolean.valueOf(value); + return Boolean.parseBoolean(value); } final PluginDescriptor pluginDescriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); return pluginDescriptor == null || pluginDescriptor.enabledByDefault(); } + @SuppressWarnings("unchecked") private Plugin instantiate(List scannedPlugins, Class clazz) throws PluginInstantiationException { PluginDependency[] pluginDependencies = clazz.getAnnotationsByType(PluginDependency.class); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java index 42a1dad7bc..86fdc97fea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java @@ -37,7 +37,6 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; -import net.runelite.api.Item; import net.runelite.api.ItemID; import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET; import net.runelite.api.MenuAction; @@ -46,6 +45,7 @@ import net.runelite.api.Player; import net.runelite.api.Skill; import static net.runelite.api.Skill.AGILITY; import net.runelite.api.Tile; +import net.runelite.api.TileItem; import net.runelite.api.TileObject; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.BoostedLevelChanged; @@ -321,7 +321,7 @@ public class AgilityPlugin extends Plugin return; } - final Item item = itemSpawned.getItem(); + final TileItem item = itemSpawned.getItem(); final Tile tile = itemSpawned.getTile(); if (item.getId() == ItemID.MARK_OF_GRACE) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index 4aed474dae..73bfbc99a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -85,7 +85,7 @@ public class BankSearch // selecting/changing tab if (closeInput) { - client.runScript(ScriptID.RESET_CHATBOX_INPUT); + client.runScript(ScriptID.RESET_CHATBOX_INPUT, 0, 0); } client.setVar(VarClientInt.INPUT_TYPE, inputType.getType()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 1f8f807362..2b7d52bf56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -78,6 +78,7 @@ import net.runelite.api.widgets.WidgetType; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; +import net.runelite.client.game.chatbox.ChatboxItemSearch; import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.plugins.banktags.BankTagsConfig; import net.runelite.client.plugins.banktags.BankTagsPlugin; @@ -113,6 +114,7 @@ public class TabInterface private static final int SCROLL_TICK = 500; private static final int INCINERATOR_WIDTH = 48; private static final int INCINERATOR_HEIGHT = 39; + private static TagTab iconToSet; private final Client client; private final ClientThread clientThread; @@ -126,10 +128,10 @@ public class TabInterface private final Rectangle bounds = new Rectangle(); private final Rectangle canvasBounds = new Rectangle(); + private ChatboxItemSearch searchProvider; private TagTab activeTab; private int maxTabs; private int currentTabIndex; - private TagTab iconToSet = null; private Instant startScroll = Instant.now(); private String rememberedSearch; private boolean waitSearchTick; @@ -156,7 +158,8 @@ public class TabInterface final ChatboxPanelManager chatboxPanelManager, final BankTagsConfig config, final Notifier notifier, - final BankSearch bankSearch) + final BankSearch bankSearch, + final ChatboxItemSearch searchProvider) { this.client = client; this.clientThread = clientThread; @@ -167,6 +170,7 @@ public class TabInterface this.config = config; this.notifier = notifier; this.bankSearch = bankSearch; + this.searchProvider = searchProvider; } public boolean isActive() @@ -333,7 +337,7 @@ public class TabInterface { bankSearch.reset(true); - clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT)); + clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT, 0, 0)); } else { @@ -343,7 +347,20 @@ public class TabInterface client.playSoundEffect(SoundEffectID.UI_BOOP); break; case Tab.CHANGE_ICON: - iconToSet = tabManager.find(Text.removeTags(event.getOpbase())); + final String tag = Text.removeTags(event.getOpbase()); + searchProvider + .tooltipText(CHANGE_ICON + " (" + tag + ")") + .onItemSelected((itemId) -> + { + TagTab iconToSet = tabManager.find(tag); + if (iconToSet != null) + { + iconToSet.setIconItemId(itemId); + iconToSet.getIcon().setItemId(itemId); + tabManager.setIcon(iconToSet.getTag(), itemId + ""); + } + }) + .build(); break; case Tab.DELETE_TAB: String target = Text.standardize(event.getOpbase()); @@ -526,12 +543,6 @@ public class TabInterface entries = createMenuEntry(event, REMOVE_TAG + " (" + activeTab.getTag() + ")", event.getTarget(), entries); client.setMenuEntries(entries); } - else if (iconToSet != null && (entry.getOption().startsWith("Withdraw-") || entry.getOption().equals("Release"))) - { - // TODO: Do not replace every withdraw option with change icon option - entry.setOption(CHANGE_ICON + " (" + iconToSet.getTag() + ")"); - client.setMenuEntries(entries); - } else if (event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() && event.getOption().equals("Deposit inventory")) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java index 2f274c5c6f..85f4c36a54 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatboxperformance/ChatboxPerformancePlugin.java @@ -27,12 +27,15 @@ package net.runelite.client.plugins.chatboxperformance; import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.Client; -import net.runelite.api.events.WidgetPositioned; +import net.runelite.api.GameState; +import net.runelite.api.ScriptID; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetPositionMode; import net.runelite.api.widgets.WidgetSizeMode; import net.runelite.api.widgets.WidgetType; +import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -47,50 +50,39 @@ public class ChatboxPerformancePlugin extends Plugin @Inject private Client client; + @Inject + private ClientThread clientThread; + @Inject private EventBus eventBus; @Override - protected void startUp() throws Exception + public void startUp() { - eventBus.subscribe(WidgetPositioned.class, this, this::onWidgetPositioned); + eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT)); + } } @Override - protected void shutDown() throws Exception + public void shutDown() { + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT)); + } eventBus.unregister(this); } - private void onWidgetPositioned(WidgetPositioned event) + private void onScriptCallbackEvent(ScriptCallbackEvent ev) { - if (!areWidgetsFixed()) + if (!"chatboxBackgroundBuilt".equals(ev.getEventName())) { - fixChatbox(); - } - } - - private boolean areWidgetsFixed() - { - Widget widget = client.getWidget(WidgetInfo.CHATBOX_TRANSPARENT_BACKGROUND); - if (widget == null) - { - return true; + return; } - Widget[] widgets = widget.getChildren(); - - if (widgets != null && widgets.length > 0) - { - Widget last = widgets[widgets.length - 1]; - return last != null && last.getOpacity() < 254; - } - - return false; - } - - private void fixChatbox() - { fixDarkBackground(); fixWhiteLines(true); fixWhiteLines(false); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java index 53b76cbc19..72591d71f0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/JagexPrintableCharMatcher.java @@ -34,6 +34,6 @@ class JagexPrintableCharMatcher extends CharMatcher // Characters which are printable return (c >= 32 && c <= 126) || c == 128 - || (c >= 161 && c <= 255); + || (c >= 160 && c <= 255); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index c1da955f6a..a7943367d8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -119,6 +119,7 @@ public class ClanChatPlugin extends Plugin private List chats = new ArrayList<>(); + @SuppressWarnings("unchecked") public static CopyOnWriteArrayList getClanMembers() { return (CopyOnWriteArrayList) clanMembers.clone(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java index a8b59775e5..a25e4c7e10 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -203,7 +203,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc .leftColor(TITLED_CONTENT_COLOR) .build()); - panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); + panelComponent.getChildren().add(LineComponent.builder().left("Location:").build()); panelComponent.getChildren().add(LineComponent.builder() .left(getArea()) .leftColor(TITLED_CONTENT_COLOR) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index 404ce70eae..1126e24492 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -85,7 +85,7 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr .leftColor(TITLED_CONTENT_COLOR) .build()); - panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); + panelComponent.getChildren().add(LineComponent.builder().left("Location:").build()); panelComponent.getChildren().add(LineComponent.builder() .left(getArea()) .leftColor(TITLED_CONTENT_COLOR) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index 1cfb81246a..b63ad9d21e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -160,7 +160,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat else { panelComponent.getChildren().add(LineComponent.builder() - .left("Possible areas:") + .left("Possible locations:") .build()); final Map locationCounts = new EnumMap<>(HotColdArea.class); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java index 6ed7ce176f..cc27dabbbb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MusicClue.java @@ -61,7 +61,7 @@ public class MusicClue extends ClueScroll implements NpcClueScroll .leftColor(TITLED_CONTENT_COLOR) .build()); - panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); + panelComponent.getChildren().add(LineComponent.builder().left("Location:").build()); panelComponent.getChildren().add(LineComponent.builder() .left("Falador Park") .leftColor(TITLED_CONTENT_COLOR) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 0273fb6044..4388c08b9b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -526,6 +526,7 @@ public class ConfigPanel extends PluginPanel openGroupConfigPanel(listItem, config, cd, false); } + @SuppressWarnings("unchecked") private void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd, boolean refresh) { showingPluginList = false; @@ -657,10 +658,10 @@ public class ConfigPanel extends PluginPanel } else if (cid2.getType().isEnum()) { - Class type = (Class) cid2.getType(); + @SuppressWarnings("unchecked") Class type = (Class) cid2.getType(); try { - Enum selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); + @SuppressWarnings("unchecked") Enum selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); if (!cid.getItem().unhideValue().equals("")) { show = selectedItem.toString().equals(cid.getItem().unhideValue()); @@ -1307,7 +1308,7 @@ public class ConfigPanel extends PluginPanel return new Dimension(PANEL_WIDTH + SCROLLBAR_WIDTH, super.getPreferredSize().height); } - private class FixedWidthPanel extends JPanel + private static class FixedWidthPanel extends JPanel { @Override public Dimension getPreferredSize() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java index 42e0a731cd..cdf7ac5611 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java @@ -44,8 +44,8 @@ import net.runelite.api.DecorativeObject; import net.runelite.api.DynamicObject; import net.runelite.api.GameObject; import net.runelite.api.GraphicsObject; +import net.runelite.api.TileItem; import net.runelite.api.GroundObject; -import net.runelite.api.Item; import net.runelite.api.ItemLayer; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; @@ -285,9 +285,9 @@ class DevToolsOverlay extends Overlay if (player.getLocalLocation().distanceTo(itemLayer.getLocalLocation()) <= MAX_DISTANCE) { Node current = itemLayer.getBottom(); - while (current instanceof Item) + while (current instanceof TileItem) { - Item item = (Item) current; + TileItem item = (TileItem) current; OverlayUtil.renderTileOverlay(graphics, itemLayer, "ID: " + item.getId() + " Qty:" + item.getQuantity(), RED); current = current.getNext(); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java index a4b21cb94d..6c8c26054b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java @@ -67,6 +67,7 @@ public class WidgetField return MessageFormatter.format("{}", value).getMessage(); } + @SuppressWarnings("unchecked") void setValue(Widget widget, Object inValue) { Object value = null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java index 1124dbb9aa..24eedb2c63 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java @@ -57,6 +57,7 @@ import net.runelite.client.util.ImageUtil; public class EmojiPlugin extends Plugin { private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>"); + private static final Pattern WHITESPACE_REGEXP = Pattern.compile("[\\s\\u00A0]"); @Inject private Client client; @@ -182,9 +183,9 @@ public class EmojiPlugin extends Plugin } @Nullable - private String updateMessage(final String message) + String updateMessage(final String message) { - final String[] messageWords = message.split(" "); + final String[] messageWords = WHITESPACE_REGEXP.split(message); boolean editedMessage = false; for (int i = 0; i < messageWords.length; i++) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java index 3d6fae9bd7..697e6440d6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsConfig.java @@ -281,6 +281,7 @@ public interface GroundItemsConfig extends Config { return false; } + @ConfigItem( keyName = "itemHighlightMode", name = "Item Highlight Mode", @@ -616,11 +617,11 @@ public interface GroundItemsConfig extends Config } @ConfigItem( - keyName = "showTimer", - name = "Show ground item tick countdown timer", - description = "Shows how many ticks left until disappearing.", - position = 48, - parent = "miscStub" + keyName = "showTimer", + name = "Show ground item tick countdown timer", + description = "Shows how many ticks left until disappearing.", + position = 48, + parent = "miscStub" ) default boolean showTimer() { 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 28b1674e00..180c333cc1 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 @@ -52,7 +52,6 @@ import lombok.Getter; import lombok.Setter; import net.runelite.api.Client; import net.runelite.api.GameState; -import net.runelite.api.Item; import net.runelite.api.ItemDefinition; import net.runelite.api.ItemID; import net.runelite.api.ItemLayer; @@ -62,16 +61,17 @@ import net.runelite.api.Node; import net.runelite.api.Player; import net.runelite.api.Scene; import net.runelite.api.Tile; +import net.runelite.api.TileItem; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ClientTick; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.ItemQuantityChanged; import net.runelite.api.events.ItemSpawned; import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; @@ -105,9 +105,10 @@ import net.runelite.client.util.Text; @Singleton public class GroundItemsPlugin extends Plugin { + @Getter(AccessLevel.PUBLIC) + public static final Map collectedGroundItems = new LinkedHashMap<>(); // ItemID for coins private static final int COINS = ItemID.COINS_995; - // items stay on the ground for 30 mins in an instance private static final int INSTANCE_DURATION_MILLIS = 45 * 60 * 1000; private static final int INSTANCE_DURATION_TICKS = (int) floor(30 * 60 / 0.6); @@ -119,7 +120,6 @@ public class GroundItemsPlugin extends Plugin private static final int DEATH_DURATION_TICKS = (int) floor(60 * 60 / 0.6); private static final int NORMAL_DURATION_MILLIS = 60 * 1000; private static final int NORMAL_DURATION_TICKS = (int) floor(60 / 0.6); - // Ground item menu options private static final int FIRST_OPTION = MenuAction.GROUND_ITEM_FIRST_OPTION.getId(); private static final int SECOND_OPTION = MenuAction.GROUND_ITEM_SECOND_OPTION.getId(); @@ -129,65 +129,45 @@ public class GroundItemsPlugin extends Plugin private static final int EXAMINE_ITEM = MenuAction.EXAMINE_ITEM_GROUND.getId(); private static final int WALK = MenuAction.WALK.getId(); private static final int CAST_ON_ITEM = MenuAction.SPELL_CAST_ON_GROUND_ITEM.getId(); - private static final String TELEGRAB_TEXT = ColorUtil.wrapWithColorTag("Telekinetic Grab", Color.GREEN) + ColorUtil.prependColorTag(" -> ", Color.WHITE); - + private final Map priceChecks = new LinkedHashMap<>(); @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) private Map.Entry textBoxBounds; - @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) private Map.Entry hiddenBoxBounds; - @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) private Map.Entry highlightBoxBounds; - @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) private boolean hotKeyPressed; - @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) private boolean hideAll; - private List hiddenItemList = new CopyOnWriteArrayList<>(); private List highlightedItemsList = new CopyOnWriteArrayList<>(); - @Inject private GroundItemInputListener inputListener; - @Inject private MouseManager mouseManager; - @Inject private KeyManager keyManager; - @Inject private Client client; - @Inject private ItemManager itemManager; - @Inject private OverlayManager overlayManager; - @Inject private GroundItemsConfig config; - @Inject private GroundItemsOverlay overlay; - @Inject private Notifier notifier; - @Inject private EventBus eventBus; - - @Getter(AccessLevel.PUBLIC) - public static final Map collectedGroundItems = new LinkedHashMap<>(); - private final Map priceChecks = new LinkedHashMap<>(); private LoadingCache highlightedItems; private LoadingCache hiddenItems; @@ -323,7 +303,7 @@ public class GroundItemsPlugin extends Plugin private void onItemSpawned(ItemSpawned itemSpawned) { - Item item = itemSpawned.getItem(); + TileItem item = itemSpawned.getItem(); Tile tile = itemSpawned.getTile(); GroundItem groundItem = buildGroundItem(tile, item); @@ -348,7 +328,7 @@ public class GroundItemsPlugin extends Plugin private void onItemDespawned(ItemDespawned itemDespawned) { - Item item = itemDespawned.getItem(); + TileItem item = itemDespawned.getItem(); Tile tile = itemDespawned.getTile(); GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation()); @@ -370,7 +350,7 @@ public class GroundItemsPlugin extends Plugin private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged) { - Item item = itemQuantityChanged.getItem(); + TileItem item = itemQuantityChanged.getItem(); Tile tile = itemQuantityChanged.getTile(); int oldQuantity = itemQuantityChanged.getOldQuantity(); int newQuantity = itemQuantityChanged.getNewQuantity(); @@ -441,7 +421,7 @@ public class GroundItemsPlugin extends Plugin } } - private void sendLootNotification(String itemName, String message) + private void sendLootNotification(String itemName, String message) { String notification = "[" + client.getLocalPlayer().getName() + "] " + "Received a " + message + " item: " + itemName; @@ -462,7 +442,7 @@ public class GroundItemsPlugin extends Plugin { int menuType = menuEntry.getType(); if (menuType == FIRST_OPTION || menuType == SECOND_OPTION || menuType == THIRD_OPTION - || menuType == FOURTH_OPTION || menuType == FIFTH_OPTION || menuType == EXAMINE_ITEM) + || menuType == FOURTH_OPTION || menuType == FIFTH_OPTION || menuType == EXAMINE_ITEM) { for (MenuEntryWithCount entryWCount : newEntries) { @@ -484,13 +464,13 @@ public class GroundItemsPlugin extends Plugin { final int aMenuType = a.getEntry().getType(); if (aMenuType == FIRST_OPTION || aMenuType == SECOND_OPTION || aMenuType == THIRD_OPTION - || aMenuType == FOURTH_OPTION || aMenuType == FIFTH_OPTION || aMenuType == EXAMINE_ITEM - || aMenuType == WALK) + || aMenuType == FOURTH_OPTION || aMenuType == FIFTH_OPTION || aMenuType == EXAMINE_ITEM + || aMenuType == WALK) { // only check for item related menu types, so we don't sort other stuff final int bMenuType = b.getEntry().getType(); if (bMenuType == FIRST_OPTION || bMenuType == SECOND_OPTION || bMenuType == THIRD_OPTION - || bMenuType == FOURTH_OPTION || bMenuType == FIFTH_OPTION || bMenuType == EXAMINE_ITEM - || bMenuType == WALK) + || bMenuType == FOURTH_OPTION || bMenuType == FIFTH_OPTION || bMenuType == EXAMINE_ITEM + || bMenuType == WALK) { final MenuEntry aEntry = a.getEntry(); final int aId = aEntry.getIdentifier(); @@ -579,7 +559,7 @@ public class GroundItemsPlugin extends Plugin } } - private GroundItem buildGroundItem(final Tile tile, final Item item) + private GroundItem buildGroundItem(final Tile tile, final TileItem item) { // Collect the data for the item final int itemId = item.getId(); @@ -711,9 +691,9 @@ public class GroundItemsPlugin extends Plugin int quantity = 1; Node current = itemLayer.getBottom(); - while (current instanceof Item) + while (current instanceof TileItem) { - Item item = (Item) current; + TileItem item = (TileItem) current; if (item.getId() == itemId) { quantity = item.getQuantity(); @@ -878,8 +858,8 @@ public class GroundItemsPlugin extends Plugin // Explicit highlight takes priority over implicit hide return isExplicitHidden || (!isExplicitHighlight && canBeHidden && underGe && underHa) - ? this.hiddenColor - : null; + ? this.hiddenColor + : null; } private int getGePriceFromItemId(int itemId) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java index 7ba8f924de..5d64fa723c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/PriceDisplayMode.java @@ -34,5 +34,5 @@ public enum PriceDisplayMode HA, GE, BOTH, - OFF; + OFF } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java index 21d68a2285..26830f14ba 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/config/ValueCalculationMode.java @@ -34,5 +34,5 @@ public enum ValueCalculationMode { HA, // calc highlight by HA value GE, // calc by GE - HIGHEST; + HIGHEST } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java index 81e73f59fd..b4772002ae 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java @@ -190,6 +190,7 @@ public class GroundMarkerPlugin extends Plugin * @param points * @return */ + @SuppressWarnings("unchecked") private Collection translateToWorld(Collection points) { if (points.isEmpty()) @@ -299,38 +300,38 @@ public class GroundMarkerPlugin extends Plugin if (hotKeyPressed && event.getOption().equals(WALK_HERE)) { MenuEntry[] menuEntries = client.getMenuEntries(); - int lastIndex = menuEntries.length; - menuEntries = Arrays.copyOf(menuEntries, lastIndex + 4); + int lastIndex = menuEntries.length; + menuEntries = Arrays.copyOf(menuEntries, lastIndex + 4); - final Tile tile = client.getSelectedSceneTile(); - if (tile == null) - { - return; - } - final WorldPoint loc = WorldPoint.fromLocalInstance(client, tile.getLocalLocation()); - final int regionId = loc.getRegionID(); + final Tile tile = client.getSelectedSceneTile(); + if (tile == null) + { + return; + } + final WorldPoint loc = WorldPoint.fromLocalInstance(client, tile.getLocalLocation()); + final int regionId = loc.getRegionID(); - for (int i = 4; i > 0; i--) - { - MenuEntry menuEntry = menuEntries[lastIndex] = new MenuEntry(); + for (int i = 4; i > 0; i--) + { + MenuEntry menuEntry = menuEntries[lastIndex] = new MenuEntry(); - final GroundMarkerPoint point = new GroundMarkerPoint(regionId, loc.getRegionX(), loc.getRegionY(), client.getPlane(), i); - final Optional stream = getPoints(regionId).stream().filter(x -> x.equals(point)).findAny(); - final String option = (stream.isPresent() && stream.get().getGroup() == i) ? UNMARK : MARK; - menuEntry.setOption(ColorUtil.prependColorTag(Text.removeTags(option + (i == 1 ? "" : " (Group " + i + ")")), getColor(i))); - menuEntry.setTarget(event.getTarget()); - menuEntry.setType(MenuAction.RUNELITE.getId()); - - lastIndex++; - } + final GroundMarkerPoint point = new GroundMarkerPoint(regionId, loc.getRegionX(), loc.getRegionY(), client.getPlane(), i); + final Optional stream = getPoints(regionId).stream().filter(x -> x.equals(point)).findAny(); + final String option = (stream.isPresent() && stream.get().getGroup() == i) ? UNMARK : MARK; + menuEntry.setOption(ColorUtil.prependColorTag(Text.removeTags(option + (i == 1 ? "" : " (Group " + i + ")")), getColor(i))); + menuEntry.setTarget(event.getTarget()); + menuEntry.setType(MenuAction.RUNELITE.getId()); + lastIndex++; + } client.setMenuEntries(menuEntries); } } private void onMenuOptionClicked(MenuOptionClicked event) { - if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId() || (!event.getOption().contains(MARK) && !event.getOption().contains(UNMARK))) + if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId() || + !(event.getOption().equals(MARK) || event.getOption().equals(UNMARK))) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java index 500661a8ff..a0d82a26d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java @@ -53,14 +53,6 @@ enum HealthbarOverride implements SpriteOverride FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "front_90px.png"), FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "front_90px.png"); - @Getter(AccessLevel.PUBLIC) - private final int spriteId; - - private final String fileName; - - @Getter(AccessLevel.PACKAGE) - private int padding = 1; - private static final Map MAP; static @@ -75,6 +67,12 @@ enum HealthbarOverride implements SpriteOverride MAP = builder.build(); } + @Getter(AccessLevel.PUBLIC) + private final int spriteId; + private final String fileName; + @Getter(AccessLevel.PACKAGE) + private int padding = 1; + static HealthbarOverride get(int spriteID) { return MAP.get(spriteID); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index 809169da28..1f14083a19 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -34,8 +34,8 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.HealthBar; -import net.runelite.api.SpriteID; import net.runelite.api.Sprite; +import net.runelite.api.SpriteID; import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java index c4d82e5a90..81b5aeaf5c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java @@ -98,7 +98,7 @@ class InventoryViewerOverlay extends Overlay public Dimension render(Graphics2D graphics) { if (plugin.isHideWhenInvOpen() - && client.getVar(VarClientInt.PLAYER_INVENTORY_OPENED) == 3) + && client.getVar(VarClientInt.PLAYER_INTERFACE_CONTAINER_OPENED) == 3) { return null; } 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 68e9278fe6..88f37516b9 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 @@ -714,7 +714,7 @@ public class LootTrackerPlugin extends Plugin break; } - int killCount = Integer.valueOf(m.group(1)); + int killCount = Integer.parseInt(m.group(1)); killCountMap.put(eventType.toUpperCase(), killCount); return; } @@ -755,11 +755,12 @@ public class LootTrackerPlugin extends Plugin if (boss.find()) { String bossName = boss.group(1); - int killCount = Integer.valueOf(boss.group(2)); + int killCount = Integer.parseInt(boss.group(2)); killCountMap.put(bossName.toUpperCase(), killCount); } } + @SuppressWarnings("unchecked") public void onItemContainerChanged(ItemContainerChanged event) { if (pvpDeath && RESPAWN_REGIONS.contains(client.getLocalPlayer().getWorldLocation().getRegionID())) @@ -849,7 +850,7 @@ public class LootTrackerPlugin extends Plugin } } - public void deleteLocalRecords() + void deleteLocalRecords() { try { @@ -960,7 +961,7 @@ public class LootTrackerPlugin extends Plugin * @param name - The String name of the record to toggle the hidden status of * @param ignore - true to ignore, false to remove */ - public void toggleNPC(String name, boolean ignore) + void toggleNPC(String name, boolean ignore) { final Set ignoredNPCSet = new HashSet<>(ignoredNPCs); if (ignore) @@ -981,7 +982,7 @@ public class LootTrackerPlugin extends Plugin * @param name - The String of the name to check * @return - true if it is being ignored, false otherwise */ - public boolean isIgnoredNPC(String name) + boolean isIgnoredNPC(String name) { return ignoredNPCs.contains(name); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java index 98f129bb61..6691c24c38 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoom.java @@ -291,6 +291,78 @@ public class AlchemyRoom extends MTARoom && player.getWorldLocation().getPlane() == 2; } + @Override + public void under(Graphics2D graphics) + { + if (!getConfig().alchemy() || best == null || !inside()) + { + return; + } + + boolean found = false; + + for (Cupboard cupboard : cupboards) + { + if (cupboard == null) + { + continue; + } + + GameObject object = cupboard.gameObject; + AlchemyItem alchemyItem = cupboard.alchemyItem; + + if (alchemyItem == AlchemyItem.EMPTY) + { + continue; + } + + if (alchemyItem.equals(best)) + { + client.setHintArrow(object.getWorldLocation()); + found = true; + } + + BufferedImage image = itemManager.getImage(alchemyItem.getId()); + Point canvasLoc = Perspective.getCanvasImageLocation(client, object.getLocalLocation(), image, IMAGE_Z_OFFSET); + + if (canvasLoc != null) + { + graphics.drawImage(image, canvasLoc.getX(), canvasLoc.getY(), null); + } + } + + if (!found && suggestion != null) + { + client.setHintArrow(suggestion.gameObject.getWorldLocation()); + } + + } + + @Override + public void over(Graphics2D graphics) + { + if (!inside() || !config.alchemy() || best == null) + { + return; + } + + Widget inventory = client.getWidget(WidgetInfo.INVENTORY); + if (inventory.isHidden()) + { + return; + } + + for (WidgetItem item : inventory.getWidgetItems()) + { + if (item.getId() != best.getId()) + { + continue; + } + + drawItem(graphics, item); + } + } + private AlchemyItem getBest() { for (int i = 0; i < INFO_LENGTH; i++) @@ -357,53 +429,6 @@ public class AlchemyRoom extends MTARoom } } - @Override - public void under(Graphics2D graphics) - { - if (!getConfig().alchemy() || best == null || !inside()) - { - return; - } - - boolean found = false; - - for (Cupboard cupboard : cupboards) - { - if (cupboard == null) - { - continue; - } - - GameObject object = cupboard.gameObject; - AlchemyItem alchemyItem = cupboard.alchemyItem; - - if (alchemyItem == AlchemyItem.EMPTY) - { - continue; - } - - if (alchemyItem.equals(best)) - { - client.setHintArrow(object.getWorldLocation()); - found = true; - } - - BufferedImage image = itemManager.getImage(alchemyItem.getId()); - Point canvasLoc = Perspective.getCanvasImageLocation(client, object.getLocalLocation(), image, IMAGE_Z_OFFSET); - - if (canvasLoc != null) - { - graphics.drawImage(image, canvasLoc.getX(), canvasLoc.getY(), null); - } - } - - if (!found && suggestion != null) - { - client.setHintArrow(suggestion.gameObject.getWorldLocation()); - } - - } - private Cupboard getSuggestion() { // check if a cupboard has the best item in it @@ -443,32 +468,6 @@ public class AlchemyRoom extends MTARoom return nearest; } - - @Override - public void over(Graphics2D graphics) - { - if (!inside() || !config.alchemy() || best == null) - { - return; - } - - Widget inventory = client.getWidget(WidgetInfo.INVENTORY); - if (inventory.isHidden()) - { - return; - } - - for (WidgetItem item : inventory.getWidgetItems()) - { - if (item.getId() != best.getId()) - { - continue; - } - - drawItem(graphics, item); - } - } - private void drawItem(Graphics2D graphics, WidgetItem item) { Rectangle bounds = item.getCanvasBounds(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java index 4e72118d6e..f0f15e6a3e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/enchantment/EnchantmentRoom.java @@ -30,10 +30,10 @@ import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; -import net.runelite.api.Item; import net.runelite.api.ItemID; import net.runelite.api.Player; import net.runelite.api.Tile; +import net.runelite.api.TileItem; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; @@ -121,7 +121,7 @@ public class EnchantmentRoom extends MTARoom private void onItemSpawned(ItemSpawned itemSpawned) { - final Item item = itemSpawned.getItem(); + final TileItem item = itemSpawned.getItem(); final Tile tile = itemSpawned.getTile(); if (item.getId() == ItemID.DRAGONSTONE_6903) @@ -134,7 +134,7 @@ public class EnchantmentRoom extends MTARoom private void onItemDespawned(ItemDespawned itemDespawned) { - final Item item = itemDespawned.getItem(); + final TileItem item = itemDespawned.getItem(); final Tile tile = itemDespawned.getTile(); if (item.getId() == ItemID.DRAGONSTONE_6903) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java index 901509a2b0..5c31f2c497 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/graveyard/GraveyardRoom.java @@ -47,10 +47,8 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager; public class GraveyardRoom extends MTARoom { - private static final int MTA_GRAVEYARD_REGION = 13462; - static final int MIN_SCORE = 16; - + private static final int MTA_GRAVEYARD_REGION = 13462; private final Client client; private final MTAPlugin plugin; private final ItemManager itemManager; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java index 262cd5b53e..01c6983d99 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/telekinetic/TelekineticRoom.java @@ -93,6 +93,11 @@ public class TelekineticRoom extends MTARoom addSubscriptions(); } + private static int manhattan(WorldPoint point1, WorldPoint point2) + { + return Math.abs(point1.getX() - point2.getX()) + Math.abs(point2.getY() - point1.getY()); + } + private void addSubscriptions() { eventBus.subscribe(GameTick.class, this, this::onGameTick); @@ -142,8 +147,8 @@ public class TelekineticRoom extends MTARoom private void onGameTick(GameTick event) { if (!config.telekinetic() - || !inside() - || client.getGameState() != GameState.LOGGED_IN) + || !inside() + || client.getGameState() != GameState.LOGGED_IN) { maze = null; moves.clear(); @@ -285,11 +290,6 @@ public class TelekineticRoom extends MTARoom return nearest(areaNext, nearestAfter); } - private static int manhattan(WorldPoint point1, WorldPoint point2) - { - return Math.abs(point1.getX() - point2.getX()) + Math.abs(point2.getY() - point1.getY()); - } - private WorldPoint nearest(WorldArea area, WorldPoint worldPoint) { int dist = Integer.MAX_VALUE; @@ -372,7 +372,7 @@ public class TelekineticRoom extends MTARoom WorldPoint nghbWorld = WorldPoint.fromLocal(client, neighbour); if (!nghbWorld.equals(next) - && !closed.contains(nghbWorld)) + && !closed.contains(nghbWorld)) { int score = scores.get(next) + 1; @@ -424,10 +424,10 @@ public class TelekineticRoom extends MTARoom private LocalPoint[] neighbours(LocalPoint point) { return new LocalPoint[] - { - neighbour(point, Direction.NORTH), neighbour(point, Direction.SOUTH), - neighbour(point, Direction.EAST), neighbour(point, Direction.WEST) - }; + { + neighbour(point, Direction.NORTH), neighbour(point, Direction.SOUTH), + neighbour(point, Direction.EAST), neighbour(point, Direction.WEST) + }; } private LocalPoint neighbour(LocalPoint point, Direction direction) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java index cf7a0ef3da..ae21c93190 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/multiindicators/MapLocations.java @@ -35,11 +35,17 @@ import net.runelite.api.Constants; public class MapLocations { + @SuppressWarnings("unchecked") private static final List[] MULTICOMBAT = new List[Constants.MAX_Z]; + @SuppressWarnings("unchecked") private static final List[] NOT_MULTICOMBAT = new List[Constants.MAX_Z]; + @SuppressWarnings("unchecked") private static final List[] ROUGH_WILDERNESS = new List[Constants.MAX_Z]; + @SuppressWarnings("unchecked") private static final List[] WILDERNESS_LEVEL_LINES = new List[Constants.MAX_Z]; + @SuppressWarnings("unchecked") private static final List[] DEADMAN_SAFE_ZONES = new List[Constants.MAX_Z]; + @SuppressWarnings("unchecked") private static final List[] PVP_WORLD_SAFE_ZONES = new List[Constants.MAX_Z]; private static Area getArea(List shapes) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index 5f504fe3af..6cfb36e09a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -87,7 +87,7 @@ public class NpcIndicatorsPlugin extends Plugin // Option added to NPC menu private static final String TAG = "Tag"; - private static final String UNTAG = "Untag"; + private static final String UNTAG = "Un-tag"; private static final Set NPC_MENU_ACTIONS = ImmutableSet.of(MenuAction.NPC_FIRST_OPTION, MenuAction.NPC_SECOND_OPTION, MenuAction.NPC_THIRD_OPTION, MenuAction.NPC_FOURTH_OPTION, MenuAction.NPC_FIFTH_OPTION); @@ -316,7 +316,7 @@ public class NpcIndicatorsPlugin extends Plugin // Add tag option menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); final MenuEntry tagEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - tagEntry.setOption(npcTags.contains(event.getIdentifier()) ? UNTAG : TAG); + tagEntry.setOption(highlightedNpcs.stream().anyMatch(npc -> npc.getIndex() == event.getIdentifier()) ? UNTAG : TAG); tagEntry.setTarget(event.getTarget()); tagEntry.setParam0(event.getActionParam0()); tagEntry.setParam1(event.getActionParam1()); @@ -328,9 +328,8 @@ public class NpcIndicatorsPlugin extends Plugin private void onMenuOptionClicked(MenuOptionClicked click) { - if (click.getMenuAction() != MenuAction.RUNELITE - || (!click.getOption().equals(TAG) - && !click.getOption().equals(UNTAG))) + if (click.getMenuAction() != MenuAction.RUNELITE || + !(click.getOption().equals(TAG) || click.getOption().equals(UNTAG))) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java index f8f86cd241..d51c65c88b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java @@ -247,47 +247,13 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener return; } + final Tile tile = client.getScene().getTiles()[client.getPlane()][event.getActionParam0()][event.getActionParam1()]; + MenuEntry[] menuEntries = client.getMenuEntries(); menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - String option = MARK; - - Scene scene = client.getScene(); - Tile[][][] tiles = scene.getTiles(); - final int x = event.getActionParam0(); - final int y = event.getActionParam1(); - final int z = client.getPlane(); - final Tile tile = tiles[z][x][y]; - final TileObject object = findTileObject(tile, event.getIdentifier()); - if (object != null) - { - final ObjectDefinition objectDefinition = client.getObjectDefinition(object.getId()); - final String name = objectDefinition.getName(); - - if (!Strings.isNullOrEmpty(name)) - { - final WorldPoint loc = WorldPoint.fromLocalInstance(client, tile.getLocalLocation()); - final int regionId = loc.getRegionID(); - - final ObjectPoint point = new ObjectPoint( - name, - regionId, - loc.getX() & (REGION_SIZE - 1), - loc.getY() & (REGION_SIZE - 1), - client.getPlane()); - - final Set objectPoints = points.get(regionId); - - if (objectPoints != null && objectPoints.contains(point)) - { - option = UNMARK; - } - } - } - - menuEntry.setOption(option); - + menuEntry.setOption(objects.contains(findTileObject(tile, event.getIdentifier())) ? UNMARK : MARK); menuEntry.setTarget(event.getTarget()); menuEntry.setParam0(event.getActionParam0()); menuEntry.setParam1(event.getActionParam1()); @@ -299,8 +265,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener private void onMenuOptionClicked(MenuOptionClicked event) { if (event.getMenuAction() != MenuAction.RUNELITE - || (!event.getOption().equals(MARK) - && !event.getOption().equals(UNMARK))) + || !(event.getOption().equals(MARK) || event.getOption().equals(UNMARK))) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 421341e75f..234e79ab73 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -824,10 +824,11 @@ public class ScreenshotPlugin extends Plugin Request request = null; if (IMGUR_IMAGE_UPLOAD_URL != null) { + RequestBody body = RequestBody.Companion.create(json, JSON); request = new Request.Builder() .url(IMGUR_IMAGE_UPLOAD_URL) .addHeader("Authorization", "Client-ID " + IMGUR_CLIENT_ID) - .post(RequestBody.create(JSON, json)) + .post(body) .build(); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/components/ModifyPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/components/ModifyPanel.java index c111789377..f0f594def6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/components/ModifyPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/banked/components/ModifyPanel.java @@ -219,6 +219,7 @@ public class ModifyPanel extends JPanel labelContainer.repaint(); } + @SuppressWarnings("unchecked") private void updateAdjustContainer() { adjustContainer.removeAll(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 1b99c8549c..8513a87814 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -76,13 +76,13 @@ import net.runelite.client.eventbus.EventBus; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.worldhopper.ping.Ping; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.ExecutorServiceExceptionLogger; import net.runelite.client.util.HotkeyListener; import net.runelite.client.util.Text; import net.runelite.client.util.WorldUtil; +import net.runelite.client.util.ping.Ping; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldClient; import net.runelite.http.api.worlds.WorldResult; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java deleted file mode 100644 index 95c4aa51c7..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/Ping.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2018, 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.worldhopper.ping; - -import com.sun.jna.Memory; -import com.sun.jna.Pointer; -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.util.OSType; -import net.runelite.http.api.worlds.World; - -@Slf4j -public class Ping -{ - private static final String RUNELITE_PING = "RuneLitePing"; - - private static final int TIMEOUT = 2000; - private static final int PORT = 43594; - - public static int ping(World world) - { - try - { - if (OSType.getOSType() == OSType.Windows) - { - return windowsPing(world); - } - return tcpPing(world); - } - catch (IOException ex) - { - log.warn("error pinging", ex); - return -1; - } - } - - private static int windowsPing(World world) throws UnknownHostException - { - IPHlpAPI ipHlpAPI = IPHlpAPI.INSTANCE; - Pointer ptr = ipHlpAPI.IcmpCreateFile(); - InetAddress inetAddress = InetAddress.getByName(world.getAddress()); - byte[] address = inetAddress.getAddress(); - String dataStr = RUNELITE_PING; - int dataLength = dataStr.length() + 1; - Pointer data = new Memory(dataLength); - data.setString(0L, dataStr); - IcmpEchoReply icmpEchoReply = new IcmpEchoReply(new Memory(IcmpEchoReply.SIZE + dataLength)); - assert icmpEchoReply.size() == IcmpEchoReply.SIZE; - int packed = (address[0] & 0xff) | ((address[1] & 0xff) << 8) | ((address[2] & 0xff) << 16) | ((address[3] & 0xff) << 24); - int ret = ipHlpAPI.IcmpSendEcho(ptr, packed, data, (short) (dataLength), Pointer.NULL, icmpEchoReply, IcmpEchoReply.SIZE + dataLength, TIMEOUT); - if (ret != 1) - { - ipHlpAPI.IcmpCloseHandle(ptr); - return -1; - } - - int rtt = Math.toIntExact(icmpEchoReply.roundTripTime.longValue()); - ipHlpAPI.IcmpCloseHandle(ptr); - - return rtt; - } - - private static int tcpPing(World world) throws IOException - { - try (Socket socket = new Socket()) - { - socket.setSoTimeout(TIMEOUT); - InetAddress inetAddress = InetAddress.getByName(world.getAddress()); - long start = System.nanoTime(); - socket.connect(new InetSocketAddress(inetAddress, PORT)); - long end = System.nanoTime(); - return (int) ((end - start) / 1000000L); - } - } -} 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 f3db54ec59..ca04dbc648 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 @@ -67,7 +67,7 @@ public class ClientLoader { try { - URL localInjected = new File("./injected-client/target/injected-client-" + RuneLiteAPI.getVersion() + ".jar").toURI().toURL(); + URL localInjected = new File("./injected-client/build/libs/injected-client-" + RuneLiteAPI.getVersion() + ".jar").toURI().toURL(); log.info("Using local injected-client"); URLClassLoader classLoader = new URLClassLoader(new URL[]{localInjected}); Class clientClass = classLoader.loadClass("client"); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 433f4d26ef..ed26a222b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -39,6 +39,7 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import javax.swing.SwingUtilities; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.MenuAction; @@ -61,6 +62,7 @@ import net.runelite.client.util.ColorUtil; import net.runelite.client.util.MiscUtils; @Singleton +@Slf4j public class OverlayRenderer extends MouseAdapter implements KeyListener { private static final int BORDER = 5; @@ -496,8 +498,23 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } subGraphics.translate(point.x, point.y); - final Dimension dimension = MoreObjects.firstNonNull(overlay.render(subGraphics), new Dimension()); - subGraphics.dispose(); + + final Dimension overlayDimension; + try + { + overlayDimension = overlay.render(subGraphics); + } + catch (Exception ex) + { + log.warn("Error during overlay rendering", ex); + return; + } + finally + { + subGraphics.dispose(); + } + + final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension()); overlay.setBounds(new Rectangle(point, dimension)); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java index 6cd707ecfe..91ee736023 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TooltipComponent.java @@ -24,6 +24,7 @@ */ package net.runelite.client.ui.overlay.components; +import com.google.common.annotations.VisibleForTesting; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; @@ -96,6 +97,7 @@ public class TooltipComponent implements RenderableEntity char[] chars = line.toCharArray(); int begin = 0; + boolean inTag = false; for (int j = 0; j < chars.length; j++) { if (chars[j] == '<') @@ -110,8 +112,9 @@ public class TooltipComponent implements RenderableEntity lineX += metrics.stringWidth(text); begin = j; + inTag = true; } - else if (chars[j] == '>') + else if (chars[j] == '>' && inTag) { String subLine = line.substring(begin + 1, j); @@ -148,6 +151,7 @@ public class TooltipComponent implements RenderableEntity } begin = j + 1; + inTag = false; } } @@ -162,12 +166,14 @@ public class TooltipComponent implements RenderableEntity return new Dimension(tooltipWidth + OFFSET * 2, tooltipHeight + OFFSET * 2); } - private static int calculateTextWidth(FontMetrics metrics, String line) + @VisibleForTesting + static int calculateTextWidth(FontMetrics metrics, String line) { char[] chars = line.toCharArray(); int textWidth = 0; int begin = 0; + boolean inTag = false; for (int j = 0; j < chars.length; j++) { if (chars[j] == '<') @@ -175,8 +181,9 @@ public class TooltipComponent implements RenderableEntity textWidth += metrics.stringWidth(line.substring(begin, j)); begin = j; + inTag = true; } - else if (chars[j] == '>') + else if (chars[j] == '>' && inTag) { String subLine = line.substring(begin + 1, j); @@ -190,6 +197,7 @@ public class TooltipComponent implements RenderableEntity } begin = j + 1; + inTag = false; } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java index 9436da087f..da1600450e 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java @@ -66,6 +66,19 @@ public class TooltipOverlay extends Overlay return null; } + try + { + return renderTooltips(graphics, tooltips); + } + finally + { + // Tooltips must always be cleared each frame + tooltipManager.clear(); + } + } + + private Dimension renderTooltips(Graphics2D graphics, List tooltips) + { final Rectangle clientCanvasBounds = new Rectangle(client.getRealDimensions()); final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); final Point mousePosition = new Point(mouseCanvasPosition.getX(), mouseCanvasPosition.getY() + OFFSET); @@ -113,7 +126,6 @@ public class TooltipOverlay extends Overlay newBounds.width = Math.max(newBounds.width, dimension.width); } - tooltipManager.clear(); return newBounds.getSize(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java b/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java index 59b2111b84..9fd82a51c2 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java +++ b/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java @@ -51,6 +51,7 @@ public class DeferredEventBus extends EventBus pendingEvents.add(new ImmutablePair<>(eventClass, event)); } + @SuppressWarnings("unchecked") public void replay() { int size = pendingEvents.size(); diff --git a/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java b/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java index 9e1a2d6659..19b48eaa4e 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java +++ b/runelite-client/src/main/java/net/runelite/client/util/GameEventManager.java @@ -33,8 +33,8 @@ import javax.inject.Singleton; import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.GameState; +import net.runelite.api.TileItem; import net.runelite.api.InventoryID; -import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.NPC; import net.runelite.api.Node; @@ -180,9 +180,9 @@ public class GameEventManager { Node current = itemLayer.getBottom(); - while (current instanceof Item) + while (current instanceof TileItem) { - final Item item = (Item) current; + final TileItem item = (TileItem) current; current = current.getNext(); diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index 1f1ee8ee0c..fdf214259f 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -52,6 +52,11 @@ import net.runelite.api.Sprite; @Slf4j public class ImageUtil { + static + { + ImageIO.setUseCache(false); + } + /** * Creates a {@link BufferedImage} from an {@link Image}. * diff --git a/runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java b/runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java index f92a2b7142..34012ece06 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ping/IPHlpAPI.java @@ -30,7 +30,7 @@ import com.sun.jna.Pointer; interface IPHlpAPI extends Library { - IPHlpAPI INSTANCE = Native.loadLibrary("IPHlpAPI", IPHlpAPI.class); + IPHlpAPI INSTANCE = Native.load("IPHlpAPI", IPHlpAPI.class); Pointer IcmpCreateFile(); diff --git a/runelite-client/src/main/scripts/ToplevelChatboxBackground.hash b/runelite-client/src/main/scripts/ToplevelChatboxBackground.hash new file mode 100644 index 0000000000..96871403a0 --- /dev/null +++ b/runelite-client/src/main/scripts/ToplevelChatboxBackground.hash @@ -0,0 +1 @@ +975C2E20F49CD83A72B6A7BA4CF34F9B476F26DCD2649B0CE79B3F93CBB892DD \ No newline at end of file diff --git a/runelite-client/src/main/scripts/ToplevelChatboxBackground.rs2asm b/runelite-client/src/main/scripts/ToplevelChatboxBackground.rs2asm new file mode 100644 index 0000000000..3504991537 --- /dev/null +++ b/runelite-client/src/main/scripts/ToplevelChatboxBackground.rs2asm @@ -0,0 +1,426 @@ +.id 923 +.int_stack_count 0 +.string_stack_count 0 +.int_var_count 5 +.string_var_count 0 +; callback "chatboxBackgroundBuilt" +; used by the ChatboxPerformancePlugin to know when it needs to rebuild. +; Unmark the plugin as hidden and toggle it. The chatbox should change opacity +; slightly + iconst 10616834 + cc_deleteall + iconst 0 + istore 0 + get_varc_int 41 + iconst 1337 + if_icmpeq LABEL8 + jump LABEL24 +LABEL8: + invoke 922 + iconst 1 + if_icmpeq LABEL12 + jump LABEL15 +LABEL12: + iconst 1 + istore 0 + jump LABEL24 +LABEL15: + getwindowmode + iconst 1 + if_icmpeq LABEL19 + jump LABEL24 +LABEL19: + iconst 0 + set_varc_int 41 + iconst 0 + iconst 0 + invoke 183 +LABEL24: + iload 0 + iconst 10616869 + if_sethide + get_varbit 6374 + iconst 1 + if_icmpeq LABEL31 + jump LABEL48 +LABEL31: + getwindowmode + iconst 1 + if_icmpne LABEL35 + jump LABEL48 +LABEL35: + iconst 1 + iconst 0 + iconst 2 + iconst 0 + iconst 10616890 + if_setposition + iconst -1 + iconst 0 + iconst 0 + iconst 0 + iconst 10617391 + if_setposition + jump LABEL60 +LABEL48: + iconst 0 + iconst 0 + iconst 0 + iconst 0 + iconst 10616890 + if_setposition + iconst 0 + iconst 0 + iconst 2 + iconst 0 + iconst 10617391 + if_setposition +LABEL60: + iconst 10616870 + cc_deleteall + iconst 10616888 + cc_deleteall + iconst 0 + istore 1 + clientclock + get_varc_int 223 + if_icmplt LABEL70 + jump LABEL82 +LABEL70: + invoke 900 + iconst 1129 + if_icmpne LABEL74 + jump LABEL82 +LABEL74: + iconst 1 + istore 1 + iconst 2155 + get_varc_int 223 + sconst "i" + iconst 10616870 + if_setontimer + jump LABEL86 +LABEL82: + iconst -1 + sconst "" + iconst 10616870 + if_setontimer +LABEL86: + invoke 921 + iconst 0 + if_icmpeq LABEL90 + jump LABEL156 +LABEL90: + iconst 1 + iconst 10616870 + if_setnoclickthrough + iload 1 + iconst 0 + if_icmpeq LABEL97 + jump LABEL135 +LABEL97: + iconst 10616870 + iconst 5 + iconst 0 + cc_create + iconst 0 + iconst 0 + iconst 1 + iconst 1 + cc_setsize + iconst 0 + iconst 0 + iconst 1 + iconst 1 + cc_setposition + iconst 1017 + cc_setgraphic + iconst 0 + cc_settiling + iconst 0 + cc_settrans + iconst 10616888 + iconst 3 + iconst 0 + cc_create + iconst 0 + iconst 1 + iconst 1 + iconst 0 + cc_setsize + iconst 0 + iconst 15 + iconst 1 + iconst 2 + cc_setposition + iconst 8418912 + cc_setcolour + iconst 1 + cc_setfill +LABEL135: + iconst 10617391 + iconst 792 + iconst 789 + iconst 790 + iconst 791 + iconst 773 + iconst 788 + iconst 0 + invoke 838 + invoke 2373 + iconst 1 + if_icmpeq LABEL148 + jump LABEL152 +LABEL148: + iconst 255 + iconst 10616835 + if_settrans + jump LABEL155 +LABEL152: + iconst 0 + iconst 10616835 + if_settrans +LABEL155: + return +LABEL156: + iconst 16384 + iconst 25 + div + istore 2 + iconst 16384 + istore 3 + get_varbit 2570 + iconst 1 + if_icmpeq LABEL166 + jump LABEL170 +LABEL166: + iconst 1 + iconst 10616870 + if_setnoclickthrough + jump LABEL176 +LABEL170: + iconst 0 + iconst 10616870 + if_setnoclickthrough + iconst 1 + iconst 10616870 + 2006 +LABEL176: + iconst 0 + istore 4 + iload 1 + iconst 0 + if_icmpeq LABEL182 + jump LABEL332 +LABEL182: + invoke 1972 + iconst 0 + if_icmpeq LABEL186 + jump LABEL266 +LABEL186: + iload 4 + iconst 20 + if_icmplt LABEL190 + jump LABEL265 +LABEL190: + iconst 10616870 + iconst 3 + iload 4 + cc_create + iconst 0 + iload 3 + iconst 1 + iconst 2 + cc_setsize + iconst 0 + iconst 0 + iconst 1 + iconst 2 + cc_setposition + iconst 0 + cc_setcolour + iconst 1 + cc_setfill + iconst 254 + cc_settrans + iconst 10616888 + iconst 3 + iload 4 + iconst 2 + multiply + cc_create + iconst 10616888 + iconst 3 + iload 4 + iconst 2 + multiply + iconst 1 + add + cc_create 1 + iload 3 + iconst 1 + iconst 2 + iconst 0 + cc_setsize + iload 3 + iconst 1 + iconst 2 + iconst 0 + cc_setsize 1 + iconst 0 + iconst 0 + iconst 0 + iconst 0 + cc_setposition + iconst 0 + iconst 15 + iconst 0 + iconst 2 + cc_setposition 1 + iconst 16777215 + cc_setcolour + iconst 16777215 + cc_setcolour 1 + iconst 1 + cc_setfill + iconst 1 + cc_setfill 1 + iconst 251 + cc_settrans + iconst 250 + cc_settrans 1 + iload 4 + iconst 1 + add + iload 3 + iload 2 + sub + istore 3 + istore 4 + jump LABEL186 +LABEL265: + sconst "chatboxBackgroundBuilt" + runelite_callback + jump LABEL332 +LABEL266: + iconst 10616870 + iconst 3 + iload 4 + cc_create + iconst 0 + iload 3 + iconst 1 + iconst 2 + cc_setsize + iconst 0 + iconst 0 + iconst 1 + iconst 2 + cc_setposition + iconst 0 + cc_setcolour + iconst 1 + cc_setfill + iconst 225 + cc_settrans + iconst 10616888 + iconst 3 + iload 4 + iconst 2 + multiply + cc_create + iconst 10616888 + iconst 3 + iload 4 + iconst 2 + multiply + iconst 1 + add + cc_create 1 + iload 3 + iconst 1 + iconst 2 + iconst 0 + cc_setsize + iload 3 + iconst 1 + iconst 2 + iconst 0 + cc_setsize 1 + iconst 0 + iconst 0 + iconst 0 + iconst 0 + cc_setposition + iconst 0 + iconst 15 + iconst 0 + iconst 2 + cc_setposition 1 + iconst 16777215 + cc_setcolour + iconst 16777215 + cc_setcolour 1 + iconst 1 + cc_setfill + iconst 1 + cc_setfill 1 + iconst 200 + cc_settrans + iconst 130 + cc_settrans 1 +LABEL332: + iconst 10617391 + iconst 1190 + iconst 1187 + iconst 1188 + iconst 1189 + iconst 1185 + iconst 1186 + iconst 1 + invoke 838 + iload 0 + iconst 1 + if_icmpeq LABEL345 + jump LABEL349 +LABEL345: + iconst 255 + iconst 10616835 + if_settrans + jump LABEL380 +LABEL349: + invoke 1972 + iconst 0 + if_icmpeq LABEL353 + jump LABEL357 +LABEL353: + iconst 155 + iconst 10616835 + if_settrans + jump LABEL380 +LABEL357: + iconst 255 + iconst 10616835 + if_settrans + iconst 10616834 + iconst 3 + iconst 0 + cc_create + iconst 0 + iconst 0 + iconst 1 + iconst 1 + cc_setsize + iconst 0 + iconst 0 + iconst 1 + iconst 1 + cc_setposition + iconst 0 + cc_setcolour + iconst 1 + cc_setfill + iconst 225 + cc_settrans +LABEL380: + return diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java index 180ade9fe0..ebf961f7c0 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java @@ -67,17 +67,9 @@ public class ContainerCalculationTest @Test public void testCalculate() { - Item coins = mock(Item.class); - when(coins.getId()) - .thenReturn(ItemID.COINS_995); - when(coins.getQuantity()) - .thenReturn(Integer.MAX_VALUE); + Item coins = new Item(ItemID.COINS_995, Integer.MAX_VALUE); - Item whip = mock(Item.class); - when(whip.getId()) - .thenReturn(ItemID.ABYSSAL_WHIP); - when(whip.getQuantity()) - .thenReturn(1_000_000_000); + Item whip = new Item(ItemID.ABYSSAL_WHIP, 1_000_000_000); Item[] items = ImmutableList.of( coins, diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java index 26348cbd16..60ab32abc6 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java @@ -54,7 +54,6 @@ public class ChatFilterPluginTest private ChatFilterConfig chatFilterConfig; @Mock - @Bind private Player localPlayer; @Inject @@ -121,6 +120,16 @@ public class ChatFilterPluginTest assertNull(chatFilterPlugin.censorMessage("te\u008Cst")); } + @Test + public void testReplayedMessage() + { + when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.REMOVE_MESSAGE); + when(chatFilterConfig.filteredWords()).thenReturn("hello osrs"); + + chatFilterPlugin.updateFilteredPatterns(); + assertNull(chatFilterPlugin.censorMessage("hello\u00A0osrs")); + } + @Test public void testMessageFromFriendIsFiltered() { diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java index 3427246946..5fd260b110 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java @@ -44,6 +44,8 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.mockito.runners.MockitoJUnitRunner; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; @RunWith(MockitoJUnitRunner.class) public class EmojiPluginTest @@ -113,4 +115,17 @@ public class EmojiPluginTest verify(messageNode).setRuneLiteFormatMessage(""); } + + @Test + public void testEmojiUpdateMessage() + { + String PARTY_POPPER = "'; + String OPEN_MOUTH = "'; + assertNull(emojiPlugin.updateMessage("@@@@@")); + assertEquals(PARTY_POPPER, emojiPlugin.updateMessage("@@@")); + assertEquals(PARTY_POPPER + ' ' + PARTY_POPPER, emojiPlugin.updateMessage("@@@ @@@")); + assertEquals(PARTY_POPPER + ' ' + OPEN_MOUTH, emojiPlugin.updateMessage("@@@\u00A0:O")); + assertEquals(PARTY_POPPER + ' ' + OPEN_MOUTH + ' ' + PARTY_POPPER, emojiPlugin.updateMessage("@@@\u00A0:O @@@")); + assertEquals(PARTY_POPPER + " Hello World " + PARTY_POPPER, emojiPlugin.updateMessage("@@@\u00A0Hello World\u00A0@@@")); + } } \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java index 9e9d2c0296..52e65eda68 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java @@ -135,8 +135,7 @@ public class ItemChargePluginTest when(client.getItemContainer(eq(InventoryID.EQUIPMENT))).thenReturn(equipmentItemContainer); Item[] items = new Item[EquipmentInventorySlot.RING.getSlotIdx() + 1]; when(equipmentItemContainer.getItems()).thenReturn(items); - Item ring = mock(Item.class); - when(ring.getId()).thenReturn(ItemID.RING_OF_FORGING); + Item ring = new Item(ItemID.RING_OF_FORGING, 1); items[EquipmentInventorySlot.RING.getSlotIdx()] = ring; // Run message chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", USED_RING_OF_FORGING, "", 0); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java index 4025ccf1b7..4a3776ad66 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java @@ -100,18 +100,13 @@ public class ItemsKeptOnDeathPluginTest when(itemManager.canonicalize(id)).thenReturn(id); when(itemManager.getItemPrice(id, true)).thenReturn(price); - return mockItem(id, qty); + return item(id, qty); } - // Creates a mocked item - private Item mockItem(final int id, final int qty) + // Creates a new item + private static Item item(final int id, final int qty) { - Item item = mock(Item.class); - - when(item.getId()).thenReturn(id); - when(item.getQuantity()).thenReturn(qty); - - return item; + return new Item(id, qty); } @Test diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java index a3183e83f2..805f79cffe 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java @@ -126,12 +126,12 @@ public class MotherlodePluginTest // Create before inventory ItemContainer inventory = mock(ItemContainer.class); Item[] items = new Item[]{ - mockItem(ItemID.RUNITE_ORE, 1), - mockItem(ItemID.GOLDEN_NUGGET, 4), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), + item(ItemID.RUNITE_ORE, 1), + item(ItemID.GOLDEN_NUGGET, 4), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), }; when(inventory.getItems()) @@ -145,16 +145,16 @@ public class MotherlodePluginTest inventory = mock(ItemContainer.class); // +1 rune, +4 nugget, +2 coal, +1 addy items = new Item[]{ - mockItem(ItemID.RUNITE_ORE, 1), - mockItem(ItemID.RUNITE_ORE, 1), - mockItem(ItemID.GOLDEN_NUGGET, 8), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.COAL, 1), - mockItem(ItemID.ADAMANTITE_ORE, 1), + item(ItemID.RUNITE_ORE, 1), + item(ItemID.RUNITE_ORE, 1), + item(ItemID.GOLDEN_NUGGET, 8), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.COAL, 1), + item(ItemID.ADAMANTITE_ORE, 1), }; when(inventory.getItems()) @@ -171,11 +171,8 @@ public class MotherlodePluginTest verifyNoMoreInteractions(motherlodeSession); } - private static Item mockItem(int itemId, int quantity) + private static Item item(int itemId, int quantity) { - Item item = mock(Item.class); - when(item.getId()).thenReturn(itemId); - when(item.getQuantity()).thenReturn(quantity); - return item; + return new Item(itemId, quantity); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java similarity index 54% rename from runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java rename to runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java index 235ae136d8..f50bf45530 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Adam + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,40 +22,24 @@ * (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.worldhopper.ping; +package net.runelite.client.ui.overlay.components; -import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.Structure; -import com.sun.jna.platform.win32.WinDef; -import java.util.Arrays; -import java.util.List; +import java.awt.FontMetrics; +import static net.runelite.client.ui.overlay.components.TooltipComponent.calculateTextWidth; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -public class IcmpEchoReply extends Structure +public class TooltipComponentTest { - private static final int IP_OPTION_INFO_SIZE = 1 + 1 + 1 + 1 + (Native.POINTER_SIZE == 8 ? 12 : 4); // on 64bit vms add 4 byte padding - public static final int SIZE = 4 + 4 + 4 + 2 + 2 + Native.POINTER_SIZE + IP_OPTION_INFO_SIZE; - - public WinDef.ULONG address; - public WinDef.ULONG status; - public WinDef.ULONG roundTripTime; - public WinDef.USHORT dataSize; - public WinDef.USHORT reserved; - public WinDef.PVOID data; - public WinDef.UCHAR ttl; - public WinDef.UCHAR tos; - public WinDef.UCHAR flags; - public WinDef.UCHAR optionsSize; - public WinDef.PVOID optionsData; - - IcmpEchoReply(final Pointer p) + @Test + public void testCalculateTextWidth() { - super(p); - } + FontMetrics fontMetics = mock(FontMetrics.class); + when(fontMetics.stringWidth(anyString())).thenAnswer((invocation) -> ((String) invocation.getArguments()[0]).length()); - @Override - protected List getFieldOrder() - { - return Arrays.asList("address", "status", "roundTripTime", "dataSize", "reserved", "data", "ttl", "tos", "flags", "optionsSize", "optionsData"); + assertEquals(11, calculateTextWidth(fontMetics, "line1>line2")); } -} +} \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index c7570fc2ce..f0240401ac 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -122,7 +122,7 @@ import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSEnumDefinition; import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSFriendsList; -import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSTileItem; import net.runelite.rs.api.RSIgnoreList; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSItemContainer; @@ -180,7 +180,7 @@ public abstract class RSClientMixin implements RSClient private static int oldMenuEntryCount; @Inject - private static RSGroundItem lastItemDespawn; + private static RSTileItem lastItemDespawn; @Inject private boolean gpu; @@ -1410,7 +1410,7 @@ public abstract class RSClientMixin implements RSClient } // Get the message node which was added - Map chatLineMap = client.getChatLineMap(); + @SuppressWarnings("unchecked") Map chatLineMap = client.getChatLineMap(); RSChatChannel chatLineBuffer = chatLineMap.get(type); MessageNode messageNode = chatLineBuffer.getLines()[0]; @@ -1431,7 +1431,7 @@ public abstract class RSClientMixin implements RSClient public static void renderWidgetLayer(Widget[] widgets, int parentId, int minX, int minY, int maxX, int maxY, int x, int y, int var8) { Callbacks callbacks = client.getCallbacks(); - HashTable componentTable = client.getComponentTable(); + @SuppressWarnings("unchecked") HashTable componentTable = client.getComponentTable(); for (Widget rlWidget : widgets) { @@ -1489,14 +1489,14 @@ public abstract class RSClientMixin implements RSClient @Inject @Override - public RSGroundItem getLastItemDespawn() + public RSTileItem getLastItemDespawn() { return lastItemDespawn; } @Inject @Override - public void setLastItemDespawn(RSGroundItem lastItemDespawn) + public void setLastItemDespawn(RSTileItem lastItemDespawn) { RSClientMixin.lastItemDespawn = lastItemDespawn; } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java index a2d807e09c..8445ea74d1 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java @@ -33,7 +33,7 @@ import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; -import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSTileItem; import net.runelite.rs.api.RSItemContainer; @Mixin(RSItemContainer.class) @@ -58,7 +58,7 @@ public abstract class RSItemContainerMixin implements RSItemContainer for (int i = 0; i < itemIds.length; ++i) { - RSGroundItem item = client.createItem(); + RSTileItem item = client.createItem(); item.setId(itemIds[i]); item.setQuantity(stackSizes[i]); items[i] = item; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index 9e883dd8b4..dbf31a0150 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -38,7 +38,7 @@ import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSBoundaryObject; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSFloorDecoration; -import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSTileItemPile; import net.runelite.rs.api.RSScene; import net.runelite.rs.api.RSTile; import net.runelite.rs.api.RSTileModel; @@ -418,7 +418,7 @@ public abstract class RSSceneMixin implements RSScene Tile tile = getTiles()[plane][x][y]; if (tile != null) { - RSGroundItemPile itemLayer = (RSGroundItemPile) tile.getItemLayer(); + RSTileItemPile itemLayer = (RSTileItemPile) tile.getItemLayer(); if (itemLayer != null) { itemLayer.setPlane(plane); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemMixin.java similarity index 92% rename from runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemMixin.java index f85f894617..a1d5d4e4ac 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemMixin.java @@ -7,10 +7,10 @@ import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; -import net.runelite.rs.api.RSGroundItem; +import net.runelite.rs.api.RSTileItem; -@Mixin(RSGroundItem.class) -public abstract class RSGroundItemMixin implements RSGroundItem +@Mixin(RSTileItem.class) +public abstract class RSTileItemMixin implements RSTileItem { @Shadow("client") private static RSClient client; @@ -22,7 +22,7 @@ public abstract class RSGroundItemMixin implements RSGroundItem private int rl$sceneY = -1; @Inject - RSGroundItemMixin() + RSTileItemMixin() { } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemPileMixin.java similarity index 89% rename from runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java rename to runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemPileMixin.java index a12da101db..f3bae3b7d0 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileItemPileMixin.java @@ -5,10 +5,10 @@ import net.runelite.api.Model; import net.runelite.api.Renderable; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; -import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSTileItemPile; -@Mixin(RSGroundItemPile.class) -public abstract class RSGroundItemPileMixin implements RSGroundItemPile +@Mixin(RSTileItemPile.class) +public abstract class RSTileItemPileMixin implements RSTileItemPile { @Inject private int itemLayerPlane; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java index 7e7f158253..dadb595700 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java @@ -24,16 +24,18 @@ */ package net.runelite.mixins; +import java.util.ArrayList; +import java.util.List; import net.runelite.api.CollisionData; import net.runelite.api.CollisionDataFlag; import net.runelite.api.Constants; import net.runelite.api.DecorativeObject; import net.runelite.api.GroundObject; -import net.runelite.api.Item; import net.runelite.api.ItemLayer; import net.runelite.api.Node; import net.runelite.api.Point; import net.runelite.api.Tile; +import net.runelite.api.TileItem; import net.runelite.api.WallObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; @@ -51,8 +53,6 @@ import net.runelite.api.events.ItemSpawned; import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectSpawned; -import java.util.ArrayList; -import java.util.List; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -62,12 +62,12 @@ import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSEntity; import net.runelite.rs.api.RSGameObject; import net.runelite.rs.api.RSGraphicsObject; -import net.runelite.rs.api.RSGroundItem; -import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSTileItemPile; import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSNodeDeque; import net.runelite.rs.api.RSProjectile; import net.runelite.rs.api.RSTile; +import net.runelite.rs.api.RSTileItem; import org.slf4j.Logger; @Mixin(RSTile.class) @@ -115,6 +115,142 @@ public abstract class RSTileMixin implements RSTile return LocalPoint.fromScene(getX(), getY()); } + @Inject + @Override + public boolean hasLineOfSightTo(Tile other) + { + // Thanks to Henke for this method :) + + if (this.getPlane() != other.getPlane()) + { + return false; + } + + CollisionData[] collisionData = client.getCollisionMaps(); + if (collisionData == null) + { + return false; + } + + int z = this.getPlane(); + int[][] collisionDataFlags = collisionData[z].getFlags(); + + Point p1 = this.getSceneLocation(); + Point p2 = other.getSceneLocation(); + if (p1.getX() == p2.getX() && p1.getY() == p2.getY()) + { + return true; + } + + int dx = p2.getX() - p1.getX(); + int dy = p2.getY() - p1.getY(); + int dxAbs = Math.abs(dx); + int dyAbs = Math.abs(dy); + + int xFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL; + int yFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL; + if (dx < 0) + { + xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_EAST; + } + else + { + xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_WEST; + } + if (dy < 0) + { + yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_NORTH; + } + else + { + yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_SOUTH; + } + + if (dxAbs > dyAbs) + { + int x = p1.getX(); + int yBig = p1.getY() << 16; // The y position is represented as a bigger number to handle rounding + int slope = (dy << 16) / dxAbs; + yBig += 0x8000; // Add half of a tile + if (dy < 0) + { + yBig--; // For correct rounding + } + int direction = dx < 0 ? -1 : 1; + + while (x != p2.getX()) + { + x += direction; + int y = yBig >>> 16; + if ((collisionDataFlags[x][y] & xFlags) != 0) + { + // Collision while traveling on the x axis + return false; + } + yBig += slope; + int nextY = yBig >>> 16; + if (nextY != y && (collisionDataFlags[x][nextY] & yFlags) != 0) + { + // Collision while traveling on the y axis + return false; + } + } + } + else + { + int y = p1.getY(); + int xBig = p1.getX() << 16; // The x position is represented as a bigger number to handle rounding + int slope = (dx << 16) / dyAbs; + xBig += 0x8000; // Add half of a tile + if (dx < 0) + { + xBig--; // For correct rounding + } + int direction = dy < 0 ? -1 : 1; + + while (y != p2.getY()) + { + y += direction; + int x = xBig >>> 16; + if ((collisionDataFlags[x][y] & yFlags) != 0) + { + // Collision while traveling on the y axis + return false; + } + xBig += slope; + int nextX = xBig >>> 16; + if (nextX != x && (collisionDataFlags[nextX][y] & xFlags) != 0) + { + // Collision while traveling on the x axis + return false; + } + } + } + + // No collision + return true; + } + + @Inject + @Override + public List getGroundItems() + { + ItemLayer layer = this.getItemLayer(); + if (layer == null) + { + return null; + } + + List result = new ArrayList(); + Node node = layer.getBottom(); + while (node instanceof TileItem) + { + result.add((TileItem) node); + node = node.getNext(); + } + return result; + } + @FieldHook("boundaryObject") @Inject public void wallObjectChanged(int idx) @@ -318,7 +454,7 @@ public abstract class RSTileMixin implements RSTile } } - @FieldHook("groundItemPile") + @FieldHook("tileItemPile") @Inject public void itemLayerChanged(int idx) { @@ -338,7 +474,7 @@ public abstract class RSTileMixin implements RSTile RSNode head = oldQueue.getHead(); for (RSNode cur = head.getNext(); cur != head; cur = cur.getNext()) { - RSGroundItem item = (RSGroundItem) cur; + RSTileItem item = (RSTileItem) cur; ItemDespawned itemDespawned = new ItemDespawned(this, item); client.getCallbacks().post(ItemDespawned.class, itemDespawned); } @@ -346,13 +482,13 @@ public abstract class RSTileMixin implements RSTile lastGroundItems[z][x][y] = newQueue; } - RSGroundItem lastUnlink = client.getLastItemDespawn(); + RSTileItem lastUnlink = client.getLastItemDespawn(); if (lastUnlink != null) { client.setLastItemDespawn(null); } - RSGroundItemPile itemLayer = (RSGroundItemPile) getItemLayer(); + RSTileItemPile itemLayer = (RSTileItemPile) getItemLayer(); if (itemLayer == null) { if (lastUnlink != null) @@ -382,7 +518,7 @@ public abstract class RSTileMixin implements RSTile boolean forward = false; if (head != previous) { - RSGroundItem prev = (RSGroundItem) previous; + RSTileItem prev = (RSTileItem) previous; if (x != prev.getX() || y != prev.getY()) { current = prev; @@ -392,7 +528,7 @@ public abstract class RSTileMixin implements RSTile RSNode next = head.getNext(); if (current == null && head != next) { - RSGroundItem n = (RSGroundItem) next; + RSTileItem n = (RSTileItem) next; if (x != n.getX() || y != n.getY()) { current = n; @@ -413,7 +549,7 @@ public abstract class RSTileMixin implements RSTile do { - RSGroundItem item = (RSGroundItem) current; + RSTileItem item = (RSTileItem) current; item.setX(x); item.setY(y); @@ -424,142 +560,6 @@ public abstract class RSTileMixin implements RSTile // Send spawn events for anything on this tile which is at the wrong location, which happens // when the scene base changes - } while (current != head && (((RSGroundItem) current).getX() != x || ((RSGroundItem) current).getY() != y)); - } - - @Inject - @Override - public boolean hasLineOfSightTo(Tile other) - { - // Thanks to Henke for this method :) - - if (this.getPlane() != other.getPlane()) - { - return false; - } - - CollisionData[] collisionData = client.getCollisionMaps(); - if (collisionData == null) - { - return false; - } - - int z = this.getPlane(); - int[][] collisionDataFlags = collisionData[z].getFlags(); - - Point p1 = this.getSceneLocation(); - Point p2 = other.getSceneLocation(); - if (p1.getX() == p2.getX() && p1.getY() == p2.getY()) - { - return true; - } - - int dx = p2.getX() - p1.getX(); - int dy = p2.getY() - p1.getY(); - int dxAbs = Math.abs(dx); - int dyAbs = Math.abs(dy); - - int xFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL; - int yFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL; - if (dx < 0) - { - xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_EAST; - } - else - { - xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_WEST; - } - if (dy < 0) - { - yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_NORTH; - } - else - { - yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_SOUTH; - } - - if (dxAbs > dyAbs) - { - int x = p1.getX(); - int yBig = p1.getY() << 16; // The y position is represented as a bigger number to handle rounding - int slope = (dy << 16) / dxAbs; - yBig += 0x8000; // Add half of a tile - if (dy < 0) - { - yBig--; // For correct rounding - } - int direction = dx < 0 ? -1 : 1; - - while (x != p2.getX()) - { - x += direction; - int y = yBig >>> 16; - if ((collisionDataFlags[x][y] & xFlags) != 0) - { - // Collision while traveling on the x axis - return false; - } - yBig += slope; - int nextY = yBig >>> 16; - if (nextY != y && (collisionDataFlags[x][nextY] & yFlags) != 0) - { - // Collision while traveling on the y axis - return false; - } - } - } - else - { - int y = p1.getY(); - int xBig = p1.getX() << 16; // The x position is represented as a bigger number to handle rounding - int slope = (dx << 16) / dyAbs; - xBig += 0x8000; // Add half of a tile - if (dx < 0) - { - xBig--; // For correct rounding - } - int direction = dy < 0 ? -1 : 1; - - while (y != p2.getY()) - { - y += direction; - int x = xBig >>> 16; - if ((collisionDataFlags[x][y] & yFlags) != 0) - { - // Collision while traveling on the y axis - return false; - } - xBig += slope; - int nextX = xBig >>> 16; - if (nextX != x && (collisionDataFlags[nextX][y] & xFlags) != 0) - { - // Collision while traveling on the x axis - return false; - } - } - } - - // No collision - return true; - } - - @Inject - @Override - public List getGroundItems() - { - ItemLayer layer = this.getItemLayer(); - if (layer == null) - { - return null; - } - - List result = new ArrayList(); - Node node = layer.getBottom(); - while (node instanceof Item) - { - result.add((Item) node); - node = node.getNext(); - } - return result; + } while (current != head && (((RSTileItem) current).getX() != x || ((RSTileItem) current).getY() != y)); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java index d5c224e73e..9e883d823f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileObjectMixin.java @@ -15,14 +15,14 @@ import net.runelite.rs.api.RSBoundaryObject; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSFloorDecoration; import net.runelite.rs.api.RSGameObject; -import net.runelite.rs.api.RSGroundItemPile; +import net.runelite.rs.api.RSTileItemPile; import net.runelite.rs.api.RSWallDecoration; @Mixins({ @Mixin(RSWallDecoration.class), @Mixin(RSGameObject.class), @Mixin(RSFloorDecoration.class), - @Mixin(RSGroundItemPile.class), + @Mixin(RSTileItemPile.class), @Mixin(RSBoundaryObject.class) }) public abstract class RSTileObjectMixin implements TileObject diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index 543bdf5c48..8135716926 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -143,7 +143,7 @@ public abstract class RSWidgetMixin implements RSWidget // parent id potentially incorrect // check the parent in the component table - HashTable componentTable = client.getComponentTable(); + @SuppressWarnings("unchecked") HashTable componentTable = client.getComponentTable(); WidgetNode widgetNode = componentTable.get(parentId); if (widgetNode == null || widgetNode.getId() != TO_GROUP(id)) { @@ -380,7 +380,7 @@ public abstract class RSWidgetMixin implements RSWidget return new Widget[0]; } - HashTable componentTable = client.getComponentTable(); + @SuppressWarnings("unchecked") HashTable componentTable = client.getComponentTable(); WidgetNode wn = componentTable.get(getId()); if (wn == null) diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 96e42195f7..3f6be7a2b3 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -609,7 +609,7 @@ public interface RSClient extends RSGameShell, Client void setObjectDefinitionLowDetail(boolean lowDetail); @Construct - RSGroundItem createItem(); + RSTileItem createItem(); @Import("Interpreter_intStackSize") @Override @@ -833,9 +833,9 @@ public interface RSClient extends RSGameShell, Client @Override int getOculusOrbFocalPointY(); - RSGroundItem getLastItemDespawn(); + RSTileItem getLastItemDespawn(); - void setLastItemDespawn(RSGroundItem lastItemDespawn); + void setLastItemDespawn(RSTileItem lastItemDespawn); @Construct RSWidget createWidget(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java index 735fda68b1..21e139e743 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTile.java @@ -16,7 +16,7 @@ public interface RSTile extends Tile @Override GameObject[] getGameObjects(); - @Import("groundItemPile") + @Import("tileItemPile") @Override ItemLayer getItemLayer(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTileItem.java similarity index 82% rename from runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTileItem.java index f4823f14b0..69daa32776 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItem.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTileItem.java @@ -1,10 +1,10 @@ package net.runelite.rs.api; - import net.runelite.api.Item; import net.runelite.api.Tile; +import net.runelite.api.TileItem; import net.runelite.mapping.Import; -public interface RSGroundItem extends RSEntity, Item +public interface RSTileItem extends RSEntity, TileItem, Item { @Import("id") @Override diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSTileItemPile.java similarity index 89% rename from runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java rename to runescape-api/src/main/java/net/runelite/rs/api/RSTileItemPile.java index c7e4d41e00..84ddc23e44 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGroundItemPile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSTileItemPile.java @@ -3,7 +3,7 @@ package net.runelite.rs.api; import net.runelite.api.ItemLayer; import net.runelite.mapping.Import; -public interface RSGroundItemPile extends ItemLayer +public interface RSTileItemPile extends ItemLayer { @Import("x") int getX(); diff --git a/runescape-client/src/main/java/BufferedSource.java b/runescape-client/src/main/java/BufferedSource.java index 7575a2fa1b..e4595aa0f2 100644 --- a/runescape-client/src/main/java/BufferedSource.java +++ b/runescape-client/src/main/java/BufferedSource.java @@ -255,9 +255,9 @@ public class BufferedSource implements Runnable { GrandExchangeOfferWorldComparator.leftTitleSprite = BuddyRankComparator.convertJpgToSprite(var4); NPC.rightTitleSprite = GrandExchangeOfferWorldComparator.leftTitleSprite.mirrorHorizontally(); if ((Client.worldProperties & 536870912) != 0) { - GroundItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", ""); + TileItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", ""); } else { - GroundItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo", ""); + TileItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo", ""); } Login.titleboxSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "titlebox", ""); @@ -315,7 +315,7 @@ public class BufferedSource implements Runnable { ScriptEvent.loginBoxCenter = Login.loginBoxX + 180; GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); + TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18); } } } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index ff2a4ec8a8..6645b0ac7b 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -3722,7 +3722,7 @@ public final class Client extends GameShell implements Usernamed { if (ServerPacket.field2161 == var1.serverPacket) { var16 = var3.method5532(); - GroundItemPile.method2764(var16); + TileItemPile.method2764(var16); field888[++field671 - 1 & 31] = var16 & 32767; var1.serverPacket = null; return true; diff --git a/runescape-client/src/main/java/ClientPreferences.java b/runescape-client/src/main/java/ClientPreferences.java index fb1274afbb..4bac5a4049 100644 --- a/runescape-client/src/main/java/ClientPreferences.java +++ b/runescape-client/src/main/java/ClientPreferences.java @@ -266,7 +266,7 @@ public class ClientPreferences { HealthBarUpdate.Interpreter_intStackSize -= 2; var10 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize]; var4 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize + 1]; - Message var15 = GroundItem.method2049(var10, var4); + Message var15 = TileItem.method2049(var10, var4); if (var15 != null) { Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.count; Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.cycle; diff --git a/runescape-client/src/main/java/FloorOverlayDefinition.java b/runescape-client/src/main/java/FloorOverlayDefinition.java index e2588621d3..255ffd91f2 100644 --- a/runescape-client/src/main/java/FloorOverlayDefinition.java +++ b/runescape-client/src/main/java/FloorOverlayDefinition.java @@ -259,10 +259,10 @@ public class FloorOverlayDefinition extends DualNode { int var4 = var0 & var2 - 1; int var5 = var1 / var2; int var6 = var1 & var2 - 1; - int var7 = GroundItemPile.method2765(var3, var5); - int var8 = GroundItemPile.method2765(var3 + 1, var5); - int var9 = GroundItemPile.method2765(var3, var5 + 1); - int var10 = GroundItemPile.method2765(var3 + 1, var5 + 1); + int var7 = TileItemPile.method2765(var3, var5); + int var8 = TileItemPile.method2765(var3 + 1, var5); + int var9 = TileItemPile.method2765(var3, var5 + 1); + int var10 = TileItemPile.method2765(var3 + 1, var5 + 1); int var11 = class4.method49(var7, var8, var4, var2); int var12 = class4.method49(var9, var10, var4, var2); return class4.method49(var11, var12, var6, var2); diff --git a/runescape-client/src/main/java/Frames.java b/runescape-client/src/main/java/Frames.java index 0f965d0a15..17e5247ff3 100644 --- a/runescape-client/src/main/java/Frames.java +++ b/runescape-client/src/main/java/Frames.java @@ -216,10 +216,10 @@ public class Frames extends DualNode { ModelData0.field1871 = (var11 + var15) / 2; ViewportMouse.field1745 = (var12 + var14) / 2; ViewportMouse.field1746 = (var16 + var17) / 2; - GroundItem.field1242 = (var15 - var11) / 2; + TileItem.field1242 = (var15 - var11) / 2; GrandExchangeEvent.field48 = (var14 - var12) / 2; Canvas.field422 = (var17 - var16) / 2; - ScriptFrame.field527 = Math.abs(GroundItem.field1242); + ScriptFrame.field527 = Math.abs(TileItem.field1242); ViewportMouse.field1741 = Math.abs(GrandExchangeEvent.field48); MenuAction.field1160 = Math.abs(Canvas.field422); } @@ -245,9 +245,9 @@ public class Frames extends DualNode { if (Math.abs(var13 * GrandExchangeEvent.field48 - var12 * Canvas.field422) > var17 * ViewportMouse.field1741 + var16 * MenuAction.field1160) { return false; } - if (Math.abs(var11 * Canvas.field422 - var13 * GroundItem.field1242) > var8 * MenuAction.field1160 + var17 * ScriptFrame.field527) { + if (Math.abs(var11 * Canvas.field422 - var13 * TileItem.field1242) > var8 * MenuAction.field1160 + var17 * ScriptFrame.field527) { return false; } - return Math.abs(var12 * GroundItem.field1242 - var11 * GrandExchangeEvent.field48) <= var16 * ScriptFrame.field527 + var8 * ViewportMouse.field1741; + return Math.abs(var12 * TileItem.field1242 - var11 * GrandExchangeEvent.field48) <= var16 * ScriptFrame.field527 + var8 * ViewportMouse.field1741; } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java index c9c90bc6d5..4104e01882 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java @@ -142,10 +142,10 @@ final class GrandExchangeOfferWorldComparator implements Comparator { scene.removeGroundItemPile(class42.plane, var0, var1); } else { long var3 = -99999999L; - GroundItem var5 = null; + TileItem var5 = null; - GroundItem var6; - for (var6 = (GroundItem)var2.last(); var6 != null; var6 = (GroundItem)var2.previous()) { + TileItem var6; + for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { ItemDefinition var7 = WorldMapArea.getItemDefinition(var6.id); long var8 = (long)var7.price; if (var7.isStackable == 1) { @@ -162,10 +162,10 @@ final class GrandExchangeOfferWorldComparator implements Comparator { scene.removeGroundItemPile(class42.plane, var0, var1); } else { var2.addLast(var5); - GroundItem var12 = null; - GroundItem var11 = null; + TileItem var12 = null; + TileItem var11 = null; - for (var6 = (GroundItem)var2.last(); var6 != null; var6 = (GroundItem)var2.previous()) { + for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { if (var5.id != var6.id) { if (var12 == null) { var12 = var6; diff --git a/runescape-client/src/main/java/Messages.java b/runescape-client/src/main/java/Messages.java index 660927f923..73e907cc05 100644 --- a/runescape-client/src/main/java/Messages.java +++ b/runescape-client/src/main/java/Messages.java @@ -413,7 +413,7 @@ public class Messages { var16 = Client.getWidgetChild(var1, var0); if (var16 != null) { WorldMapID.method542(); - GroundItem.method2053(var1, var0, HealthBar.method1957(class268.getWidgetClickMask(var16)), var16.itemId); + TileItem.method2053(var1, var0, HealthBar.method1957(class268.getWidgetClickMask(var16)), var16.itemId); Client.isItemSelected = 0; Client.selectedSpellActionName = FontName.method5318(var16); if (Client.selectedSpellActionName == null) { diff --git a/runescape-client/src/main/java/MusicPatch.java b/runescape-client/src/main/java/MusicPatch.java index d50a539aad..8cbff818f5 100644 --- a/runescape-client/src/main/java/MusicPatch.java +++ b/runescape-client/src/main/java/MusicPatch.java @@ -357,7 +357,7 @@ public class MusicPatch extends Node { var32 = var41 * (var30 - var44) + (var30 - var44) / 2; for (var33 = var44; var33 < var30; ++var33) { - var34 = GroundItemPile.method2767(var32, var30 - var44); + var34 = TileItemPile.method2767(var32, var30 - var44); this.field2476[var33] = (byte)(var34 * this.field2476[var33] + 32 >> 6); var32 += var31 - var41; } @@ -405,7 +405,7 @@ public class MusicPatch extends Node { var32 = var47 * (var30 - var44) + (var30 - var44) / 2; for (var33 = var44; var33 < var30; ++var33) { - var34 = GroundItemPile.method2767(var32, var30 - var44); + var34 = TileItemPile.method2767(var32, var30 - var44); int var35 = var34 + (this.field2477[var33] & 255); if (var35 < 0) { var35 = 0; diff --git a/runescape-client/src/main/java/RouteStrategy.java b/runescape-client/src/main/java/RouteStrategy.java index c57d525ea1..13ee29c6bb 100644 --- a/runescape-client/src/main/java/RouteStrategy.java +++ b/runescape-client/src/main/java/RouteStrategy.java @@ -58,7 +58,7 @@ public abstract class RouteStrategy { class197.FloorUnderlayDefinition_clearCached(); FloorUnderlayDefinition.FloorUnderlayDefinition_cached.clear(); KitDefinition.KitDefinition_cached.clear(); - GroundItemPile.ObjectDefinition_clearCached(); + TileItemPile.ObjectDefinition_clearCached(); AbstractWorldMapIcon.NpcDefinition_clearCached(); ItemDefinition.ItemDefinition_cached.clear(); ItemDefinition.ItemDefinition_cachedModels.clear(); diff --git a/runescape-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java index 93ae0a768d..ccb9fb79c4 100644 --- a/runescape-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -383,7 +383,7 @@ public class Scene { ) @Export("newGroundItemPile") public void newGroundItemPile(int var1, int var2, int var3, int var4, Entity var5, long var6, Entity var8, Entity var9) { - GroundItemPile var10 = new GroundItemPile(); + TileItemPile var10 = new TileItemPile(); var10.first = var5; var10.x = var2 * 128 + 64; var10.y = var3 * 128 + 64; @@ -410,7 +410,7 @@ public class Scene { this.tiles[var1][var2][var3] = new Tile(var1, var2, var3); } - this.tiles[var1][var2][var3].groundItemPile = var10; + this.tiles[var1][var2][var3].tileItemPile = var10; } @ObfuscatedName("c") @@ -713,7 +713,7 @@ public class Scene { public void removeGroundItemPile(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if (var4 != null) { - var4.groundItemPile = null; + var4.tileItemPile = null; } } @@ -1470,7 +1470,7 @@ public class Scene { var22.entity.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var22.x * 4096 - Scene_cameraX, var22.tileHeight - Scene_cameraY, var22.y * 4096 - Scene_cameraZ, var22.tag); } - GroundItemPile var23 = var3.groundItemPile; + TileItemPile var23 = var3.tileItemPile; if (var23 != null && var23.height == 0) { if (var23.second != null) { var23.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var23.x * 4096 - Scene_cameraX, var23.tileHeight - Scene_cameraY, var23.y * 4096 - Scene_cameraZ, var23.tag); @@ -1688,7 +1688,7 @@ public class Scene { var3.drawSecondary = false; --tileUpdateCount; - GroundItemPile var32 = var3.groundItemPile; + TileItemPile var32 = var3.tileItemPile; if (var32 != null && var32.height != 0) { if (var32.second != null) { var32.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var32.x * 4096 - Scene_cameraX, var32.tileHeight - Scene_cameraY - var32.height, var32.y * 4096 - Scene_cameraZ, var32.tag); diff --git a/runescape-client/src/main/java/Tile.java b/runescape-client/src/main/java/Tile.java index b9af45976b..5da0aa98ce 100644 --- a/runescape-client/src/main/java/Tile.java +++ b/runescape-client/src/main/java/Tile.java @@ -71,8 +71,8 @@ public final class Tile extends Node { @ObfuscatedSignature( signature = "Ldc;" ) - @Export("groundItemPile") - GroundItemPile groundItemPile; + @Export("tileItemPile") + TileItemPile tileItemPile; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 52989903 diff --git a/runescape-client/src/main/java/TileItem.java b/runescape-client/src/main/java/TileItem.java new file mode 100644 index 0000000000..c555b201bd --- /dev/null +++ b/runescape-client/src/main/java/TileItem.java @@ -0,0 +1,87 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("ch") +@Implements("TileItem") +public final class TileItem extends Entity { + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = 1900937269 + ) + static int field1242; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Llx;" + ) + @Export("logoSprite") + static IndexedSprite logoSprite; + @ObfuscatedName("q") + @ObfuscatedGetter( + intValue = 1946972179 + ) + @Export("id") + int id; + @ObfuscatedName("w") + @ObfuscatedGetter( + intValue = -1304382567 + ) + @Export("quantity") + int quantity; + + TileItem() { + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(I)Ldm;", + garbageValue = "759381421" + ) + @Export("getModel") + protected final Model getModel() { + return WorldMapArea.getItemDefinition(this.id).getModel(this.quantity); + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(Lhp;B)V", + garbageValue = "97" + ) + public static void method2054(AbstractArchive var0) { + StructDefinition.StructDefinition_archive = var0; + } + + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "(III)Lbj;", + garbageValue = "308740376" + ) + static Message method2049(int var0, int var1) { + ChatChannel var2 = (ChatChannel)Messages.Messages_channels.get(var0); + return var2.getMessage(var1); + } + + @ObfuscatedName("hs") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "96373324" + ) + static void method2053(int var0, int var1, int var2, int var3) { + Widget var4 = Client.getWidgetChild(var0, var1); + if (var4 != null && var4.onTargetEnter != null) { + ScriptEvent var5 = new ScriptEvent(); + var5.widget = var4; + var5.args = var4.onTargetEnter; + LoginPacket.runScriptEvent(var5); + } + + Client.field812 = var3; + Client.isSpellSelected = true; + WorldMapEvent.field359 = var0; + Client.field848 = var1; + WorldMapCacheName.selectedSpellFlags = var2; + Strings.method4120(var4); + } +} diff --git a/runescape-client/src/main/java/TileItemPile.java b/runescape-client/src/main/java/TileItemPile.java new file mode 100644 index 0000000000..a22205f385 --- /dev/null +++ b/runescape-client/src/main/java/TileItemPile.java @@ -0,0 +1,109 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("dc") +@Implements("TileItemPile") +public final class TileItemPile +{ + @ObfuscatedName("q") + @ObfuscatedGetter( + intValue = -706647707 + ) + @Export("tileHeight") + int tileHeight; + @ObfuscatedName("w") + @ObfuscatedGetter( + intValue = -1749434399 + ) + @Export("x") + int x; + @ObfuscatedName("e") + @ObfuscatedGetter( + intValue = 1687183849 + ) + @Export("y") + int y; + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "Leo;" + ) + @Export("first") + Entity first; + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "Leo;" + ) + @Export("second") + Entity second; + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Leo;" + ) + @Export("third") + Entity third; + @ObfuscatedName("b") + @ObfuscatedGetter( + longValue = -6836359089398778317L + ) + @Export("tag") + long tag; + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = -1167512637 + ) + @Export("height") + int height; + + TileItemPile() { + } + + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "-989207473" + ) + public static int method2767(int var0, int var1) { + int var2 = var0 >>> 31; + return (var0 + var2) / var1 - var2; + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "-23" + ) + static void method2764(int var0) { + ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var1 != null) { + var1.remove(); + } + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "1314012151" + ) + static final int method2765(int var0, int var1) { + int var2 = MouseHandler.method1021(var0 - 1, var1 - 1) + MouseHandler.method1021(1 + var0, var1 - 1) + MouseHandler.method1021(var0 - 1, 1 + var1) + MouseHandler.method1021(1 + var0, 1 + var1); + int var3 = MouseHandler.method1021(var0 - 1, var1) + MouseHandler.method1021(var0 + 1, var1) + MouseHandler.method1021(var0, var1 - 1) + MouseHandler.method1021(var0, var1 + 1); + int var4 = MouseHandler.method1021(var0, var1); + return var2 / 16 + var3 / 8 + var4 / 4; + } + + @ObfuscatedName("y") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "76" + ) + @Export("ObjectDefinition_clearCached") + public static void ObjectDefinition_clearCached() { + ObjectDefinition.ObjectDefinition_cached.clear(); + ObjectDefinition.ObjectDefinition_cachedModelData.clear(); + ObjectDefinition.ObjectDefinition_cachedEntities.clear(); + ObjectDefinition.ObjectDefinition_cachedModels.clear(); + } +} diff --git a/runescape-client/src/main/java/Timer.java b/runescape-client/src/main/java/Timer.java index c11bc6050d..46cb533561 100644 --- a/runescape-client/src/main/java/Timer.java +++ b/runescape-client/src/main/java/Timer.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jr") -@Implements("Timer") +@Implements("Timer") //GroundItem public class Timer { @ObfuscatedName("q") @ObfuscatedGetter( @@ -427,7 +427,7 @@ public class Timer { ObjectDefinition.ObjectDefinition_modelsArchive = var2; ObjectDefinition.ObjectDefinition_isLowDetail = var34; FaceNormal.setNpcDefinitionArchives(class215.archive2, NPCDefinition.archive7); - GroundItem.method2054(class215.archive2); + TileItem.method2054(class215.archive2); Archive var27 = class215.archive2; Archive var5 = NPCDefinition.archive7; boolean var6 = Client.isMembersWorld; diff --git a/runescape-client/src/main/java/VarbitDefinition.java b/runescape-client/src/main/java/VarbitDefinition.java index f5fd561aa6..d07efb88c1 100644 --- a/runescape-client/src/main/java/VarbitDefinition.java +++ b/runescape-client/src/main/java/VarbitDefinition.java @@ -150,7 +150,7 @@ public class VarbitDefinition extends DualNode { Login.worldSelectOpen = false; GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); + TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18); break; } @@ -160,7 +160,7 @@ public class VarbitDefinition extends DualNode { Login.worldSelectOpen = false; GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); + TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18); } else { if (Login.worldSelectPage > 0 && Login.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= Login.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= ParamDefinition.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= ParamDefinition.canvasHeight / 2 + 50) { --Login.worldSelectPage; @@ -177,7 +177,7 @@ public class VarbitDefinition extends DualNode { Login.worldSelectOpen = false; GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); + TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18); break; } diff --git a/runescape-client/src/main/java/class1.java b/runescape-client/src/main/java/class1.java index 343897644f..d7fcf20937 100644 --- a/runescape-client/src/main/java/class1.java +++ b/runescape-client/src/main/java/class1.java @@ -137,7 +137,7 @@ final class class1 implements class0 { } } else { - GroundItem var32; + TileItem var32; if (class185.field2321 == var0) { var2 = var1.method5722(); var3 = (var2 >> 4 & 7) + DefaultsGroup.field3819; @@ -146,7 +146,7 @@ final class class1 implements class0 { if (var3 >= 0 && var4 >= 0 && var3 < 104 && var4 < 104) { NodeDeque var31 = Client.groundItems[class42.plane][var3][var4]; if (var31 != null) { - for (var32 = (GroundItem)var31.last(); var32 != null; var32 = (GroundItem)var31.previous()) { + for (var32 = (TileItem)var31.last(); var32 != null; var32 = (TileItem)var31.previous()) { if ((var5 & 32767) == var32.id) { var32.remove(); break; @@ -204,7 +204,7 @@ final class class1 implements class0 { if (var6 >= 0 && var7 >= 0 && var6 < 104 && var7 < 104) { NodeDeque var42 = Client.groundItems[class42.plane][var6][var7]; if (var42 != null) { - for (GroundItem var34 = (GroundItem)var42.last(); var34 != null; var34 = (GroundItem)var42.previous()) { + for (TileItem var34 = (TileItem)var42.last(); var34 != null; var34 = (TileItem)var42.previous()) { if ((var2 & 32767) == var34.id && var4 == var34.quantity) { var34.quantity = var3; break; @@ -222,7 +222,7 @@ final class class1 implements class0 { var5 = (var4 >> 4 & 7) + DefaultsGroup.field3819; var6 = (var4 & 7) + ChatChannel.field1306; if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { - var32 = new GroundItem(); + var32 = new TileItem(); var32.id = var3; var32.quantity = var2; if (Client.groundItems[class42.plane][var5][var6] == null) { diff --git a/runescape-client/src/main/java/class189.java b/runescape-client/src/main/java/class189.java index 4c1ee80c96..cf92af7449 100644 --- a/runescape-client/src/main/java/class189.java +++ b/runescape-client/src/main/java/class189.java @@ -23,7 +23,7 @@ public class class189 { } else { GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); + TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18); int var4; if (Client.gameState == 0 || Client.gameState == 5) { byte var3 = 20; diff --git a/runescape-client/src/main/java/class2.java b/runescape-client/src/main/java/class2.java index a35a1a567a..9d41d32194 100644 --- a/runescape-client/src/main/java/class2.java +++ b/runescape-client/src/main/java/class2.java @@ -253,7 +253,7 @@ final class class2 implements class0 { Messages.method2163(var20 + 1, var9.id, var9.childIndex, var9.itemId, ""); } else if (var20 == 10) { WorldMapID.method542(); - GroundItem.method2053(var9.id, var9.childIndex, HealthBar.method1957(class268.getWidgetClickMask(var9)), var9.itemId); + TileItem.method2053(var9.id, var9.childIndex, HealthBar.method1957(class268.getWidgetClickMask(var9)), var9.itemId); Client.selectedSpellActionName = FontName.method5318(var9); if (Client.selectedSpellActionName == null) { Client.selectedSpellActionName = "null"; diff --git a/runescape-client/src/main/java/class65.java b/runescape-client/src/main/java/class65.java index dfbd94b70e..f28c0099ac 100644 --- a/runescape-client/src/main/java/class65.java +++ b/runescape-client/src/main/java/class65.java @@ -340,7 +340,7 @@ public class class65 extends RouteStrategy { if (var17 == 3) { NodeDeque var33 = Client.groundItems[class42.plane][var15][var16]; if (var33 != null) { - for (GroundItem var37 = (GroundItem)var33.first(); var37 != null; var37 = (GroundItem)var33.next()) { + for (TileItem var37 = (TileItem)var33.first(); var37 != null; var37 = (TileItem)var33.next()) { ItemDefinition var35 = WorldMapArea.getItemDefinition(var37.id); if (Client.isItemSelected == 1) { class188.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + ClientPreferences.colorStartTag(16748608) + var35.name, 16, var37.id, var15, var16); diff --git a/runescape-client/src/main/java/class96.java b/runescape-client/src/main/java/class96.java index b089d6c316..0bbb7f51df 100644 --- a/runescape-client/src/main/java/class96.java +++ b/runescape-client/src/main/java/class96.java @@ -400,7 +400,7 @@ public class class96 { Login.runesSprite = null; GrandExchangeOfferWorldComparator.leftTitleSprite = null; NPC.rightTitleSprite = null; - GroundItem.logoSprite = null; + TileItem.logoSprite = null; Login.title_muteSprite = null; Login.options_buttons_0Sprite = null; Decimator.options_buttons_2Sprite = null;