From c5586123c86de7baa5b13b9e07bb26391d666231 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 9 Sep 2021 20:38:03 -0400 Subject: [PATCH 01/16] npc overlay: set lower priority on npc change and despawn handlers Similar to spawn, these need to run after plugins for most of the highlight functions to work correctly --- .../client/game/npcoverlay/NpcOverlayService.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java b/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java index a8e01bf489..242854a4ca 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java +++ b/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java @@ -81,14 +81,18 @@ public class NpcOverlayService } } - @Subscribe + @Subscribe( + priority = -1 + ) private void onNpcDespawned(NpcDespawned npcDespawned) { final NPC npc = npcDespawned.getNpc(); highlightedNpcs.remove(npc); } - @Subscribe + @Subscribe( + priority = -1 + ) private void onNpcChanged(NpcChanged event) { final NPC npc = event.getNpc(); From 9cadc62eba89699758e6e1fafba58fac5fc1562d Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 10 Sep 2021 18:05:25 -0400 Subject: [PATCH 02/16] widget overlay: correct raids points overlay position --- .../main/java/net/runelite/client/ui/overlay/WidgetOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 43a1faf32e..9435086d7c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -47,7 +47,7 @@ public class WidgetOverlay extends Overlay // The client forces the oxygen bar below the xp tracker, so set its priority lower new WidgetOverlay(client, WidgetInfo.FOSSIL_ISLAND_OXYGENBAR, OverlayPosition.TOP_CENTER, OverlayPriority.HIGH), new XpTrackerWidgetOverlay(overlayManager, client, WidgetInfo.EXPERIENCE_TRACKER_WIDGET, OverlayPosition.TOP_RIGHT), - new WidgetOverlay(client, WidgetInfo.RAIDS_POINTS_INFOBOX, OverlayPosition.TOP_RIGHT), + new WidgetOverlay(client, WidgetInfo.RAIDS_POINTS_INFOBOX, OverlayPosition.TOP_LEFT), new WidgetOverlay(client, WidgetInfo.TOB_PARTY_INTERFACE, OverlayPosition.TOP_LEFT), new WidgetOverlay(client, WidgetInfo.TOB_PARTY_STATS, OverlayPosition.TOP_LEFT), new WidgetOverlay(client, WidgetInfo.GWD_KC, OverlayPosition.TOP_RIGHT), From 9cd1cbcea0e0dce5b57b43494617324587037392 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Sep 2021 00:02:19 -0400 Subject: [PATCH 03/16] music: check game state before applying sliders on startup This accesses vars, which typically cannot be accessed when not logged in, or in early startup --- .../java/net/runelite/client/plugins/music/MusicPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 36081a3e10..96b08f83e2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -186,7 +186,7 @@ public class MusicPlugin extends Plugin channels = new Channel[]{musicChannel, effectChannel, areaChannel}; addMusicButtons(); - if (musicConfig.granularSliders()) + if (client.getGameState() == GameState.LOGGED_IN && musicConfig.granularSliders()) { updateMusicOptions(); resetSettingsWindow(); From 3c5f8123313b5f52027b5b2bd32f6c6c0d49dea1 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Sep 2021 10:53:05 -0400 Subject: [PATCH 04/16] npc overlay: clear highlighted npcs on logout Despawn events don't fire for npcs on logout, copied from the npc highlight plugin --- .../client/game/npcoverlay/NpcOverlayService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java b/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java index 242854a4ca..db96bc91a5 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java +++ b/runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlayService.java @@ -33,7 +33,9 @@ import java.util.function.Function; import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.NPC; +import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.NpcChanged; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; @@ -62,6 +64,16 @@ public class NpcOverlayService eventBus.register(this); } + @Subscribe + private void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOGIN_SCREEN || + event.getGameState() == GameState.HOPPING) + { + highlightedNpcs.clear(); + } + } + @Subscribe( // Run after plugins, which typically capture NPCs on spawn and reference them in the highlight functions priority = -1 From a23119257849c37ef3567629e3fe7fdff1a08c3d Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Sep 2021 00:13:58 -0400 Subject: [PATCH 05/16] client: update jna to 5.9.0 This is required for macos aarch64 support --- runelite-client/pom.xml | 5 ++--- .../client/plugins/worldhopper/ping/IcmpEchoReply.java | 5 +++-- .../net/runelite/client/plugins/worldhopper/ping/RLLibC.java | 2 -- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 922c9c3a6a..da1746631b 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -198,16 +198,15 @@ archive-patcher 1.0 - net.java.dev.jna jna - 4.5.1 + 5.9.0 net.java.dev.jna jna-platform - 4.5.1 + 5.9.0 com.google.code.findbugs diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java index 0e1cc198a3..038022f44d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/IcmpEchoReply.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.worldhopper.ping; +import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.platform.win32.WinDef; @@ -32,8 +33,8 @@ import java.util.List; public class IcmpEchoReply extends Structure { - private static final int IP_OPTION_INFO_SIZE = 1 + 1 + 1 + 1 + (Pointer.SIZE == 8 ? 12 : 4); // on 64bit vms add 4 byte padding - public static final int SIZE = 4 + 4 + 4 + 2 + 2 + Pointer.SIZE + IP_OPTION_INFO_SIZE; + 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; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/RLLibC.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/RLLibC.java index f495ccff83..3000e5a85e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/RLLibC.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/ping/RLLibC.java @@ -41,8 +41,6 @@ interface RLLibC extends LibC int socket(int domain, int type, int protocol); - void close(int socket); - int sendto(int sockfd, byte[] buf, int len, int flags, byte[] dest_addr, int addrlen); int recvfrom(int sockfd, Pointer buf, int len, int flags, Pointer src_addr, Pointer addrlen); From ac64ab8955353bb0aa0e4a239ef5ec506bb79686 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 11 Sep 2021 07:58:34 +0200 Subject: [PATCH 06/16] project: Mixins roof removal --- .../net/runelite/mixins/RSSceneMixin.java | 267 ++++++++++++++++-- .../java/net/runelite/rs/api/RSClient.java | 3 + .../java/net/runelite/rs/api/RSNodeDeque.java | 3 + 3 files changed, 249 insertions(+), 24 deletions(-) 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 a345d4496b..56a52f8b1f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -24,10 +24,17 @@ */ package net.runelite.mixins; +import java.util.HashSet; +import java.util.Set; +import static net.runelite.api.Constants.ROOF_FLAG_BETWEEN; +import static net.runelite.api.Constants.ROOF_FLAG_DESTINATION; +import static net.runelite.api.Constants.ROOF_FLAG_HOVERED; +import static net.runelite.api.Constants.ROOF_FLAG_POSITION; import net.runelite.api.Perspective; -import net.runelite.api.Tile; import net.runelite.api.SceneTileModel; import net.runelite.api.SceneTilePaint; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.mixins.Copy; @@ -37,11 +44,13 @@ 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.RSNode; import net.runelite.rs.api.RSNodeDeque; +import net.runelite.rs.api.RSPlayer; import net.runelite.rs.api.RSScene; +import net.runelite.rs.api.RSSceneTileModel; import net.runelite.rs.api.RSTile; import net.runelite.rs.api.RSTileItem; -import net.runelite.rs.api.RSSceneTileModel; @Mixin(RSScene.class) public abstract class RSSceneMixin implements RSScene @@ -63,18 +72,33 @@ public abstract class RSSceneMixin implements RSScene @Shadow("Rasterizer3D_colorPalette") private static int[] colorPalette; - @Inject - private static int[] tmpX = new int[6]; - @Shadow("skyboxColor") static int skyboxColor; + @Inject + private static int[] tmpX = new int[6]; + @Inject private static int[] tmpY = new int[6]; @Inject private static int rl$drawDistance; + @Inject + private static int rl$roofRemovalMode = 0; + + @Inject + private static int[][][] rl$tiles = new int[4][104][104]; + + @Inject + private static final Set rl$tilesToRemove = new HashSet<>(); + + @Inject + private static int rl$hoverX = -1; + + @Inject + private static int rl$hoverY = -1; + @Replace("draw") void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane) { @@ -208,6 +232,73 @@ public abstract class RSSceneMixin implements RSScene client.setTileUpdateCount(0); + if (rl$roofRemovalMode != 0) + { + rl$tilesToRemove.clear(); + RSPlayer localPlayer = client.getLocalPlayer(); + if (localPlayer != null && (rl$roofRemovalMode & ROOF_FLAG_POSITION) != 0) + { + LocalPoint localLocation = localPlayer.getLocalLocation(); + if (localLocation.isInScene()) + { + rl$tilesToRemove.add(rl$tiles[client.getPlane()][localLocation.getSceneX()][localLocation.getSceneY()]); + } + } + + if (rl$hoverX >= 0 && rl$hoverX < 104 && rl$hoverY >= 0 && rl$hoverY < 104 && (rl$roofRemovalMode & ROOF_FLAG_HOVERED) != 0) + { + rl$tilesToRemove.add(rl$tiles[client.getPlane()][rl$hoverX][rl$hoverY]); + } + + LocalPoint localDestinationLocation = client.getLocalDestinationLocation(); + if (localDestinationLocation != null && localDestinationLocation.isInScene() && (rl$roofRemovalMode & ROOF_FLAG_DESTINATION) != 0) + { + rl$tilesToRemove.add(rl$tiles[client.getPlane()][localDestinationLocation.getSceneX()][localDestinationLocation.getSceneY()]); + } + + if (client.getCameraPitch() < 310 && (rl$roofRemovalMode & ROOF_FLAG_BETWEEN) != 0 && localPlayer != null) + { + int playerX = localPlayer.getX() >> 7; + int playerY = localPlayer.getY() >> 7; + int var29 = client.getCameraX() >> 7; + int var30 = client.getCameraY() >> 7; + if (playerX >= 0 && playerY >= 0 && var29 >= 0 && var30 >= 0 && playerX < 104 && playerY < 104 && var29 < 104 && var30 < 104) + { + int var31 = Math.abs(playerX - var29); + int var32 = Integer.compare(playerX, var29); + int var33 = -Math.abs(playerY - var30); + int var34 = Integer.compare(playerY, var30); + int var35 = var31 + var33; + + while (var29 != playerX || var30 != playerY) + { + if (blocking(client.getPlane(), var29, var30)) + { + rl$tilesToRemove.add(rl$tiles[client.getPlane()][var29][var30]); + } + + int var36 = 2 * var35; + if (var36 >= var33) + { + var35 += var33; + var29 += var32; + } + else + { + var35 += var31; + var30 += var34; + } + } + } + } + } + + if (!client.isMenuOpen()) + { + rl$hoverY = -1; + rl$hoverX = -1; + } + for (int z = minLevel; z < maxY; ++z) { RSTile[][] planeTiles = tiles[z]; @@ -219,22 +310,24 @@ public abstract class RSSceneMixin implements RSScene RSTile tile = planeTiles[x][y]; if (tile != null) { - if (tile.getPhysicalLevel() <= plane - && (isGpu - || renderArea[x - screenCenterX + DEFAULT_DISTANCE][y - screenCenterZ + DEFAULT_DISTANCE] - || tileHeights[z][x][y] - cameraY >= 2000)) + int var30 = rl$tiles[client.getPlane()][x][y]; + if (tile.getPhysicalLevel() > plane && rl$roofRemovalMode == 0 + || !isGpu && !renderArea[x - screenCenterX + DEFAULT_DISTANCE][y - screenCenterZ + DEFAULT_DISTANCE] + && tileHeights[z][x][y] - cameraY < 2000 + || rl$roofRemovalMode != 0 && client.getPlane() < tile.getPhysicalLevel() + && var30 != 0 && rl$tilesToRemove.contains(var30)) + { + tile.setDraw(false); + tile.setVisible(false); + tile.setWallCullDirection(0); + } + else { tile.setDraw(true); tile.setVisible(true); tile.setDrawEntities(true); client.setTileUpdateCount(client.getTileUpdateCount() + 1); } - else - { - tile.setDraw(false); - tile.setVisible(false); - tile.setWallCullDirection(0); - } } } } @@ -409,6 +502,15 @@ public abstract class RSSceneMixin implements RSScene @Replace("drawTileUnderlay") public void copy$drawTileUnderlay(SceneTilePaint tile, int z, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y) { + byte[][][] tileSettings = client.getTileSettings(); + final boolean checkClick = client.isCheckClick(); + + int tilePlane = z; + if ((tileSettings[1][x][x] & 2) != 0) + { + tilePlane = z - 1; + } + if (!client.isGpu()) { try @@ -419,7 +521,11 @@ public abstract class RSSceneMixin implements RSScene { client.getLogger().warn("error during tile underlay rendering", ex); } - return; + + if (rl$roofRemovalMode == 0 || !checkClick || client.getPlane() != tilePlane) + { + return; + } } final DrawCallbacks drawCallbacks = client.getDrawCallbacks(); @@ -444,8 +550,6 @@ public abstract class RSSceneMixin implements RSScene final int mouseX2 = client.getMouseX2(); final int mouseY2 = client.getMouseY2(); - final boolean checkClick = client.isCheckClick(); - int var9; int var10 = var9 = (x << 7) - cameraX2; int var11; @@ -508,6 +612,11 @@ public abstract class RSSceneMixin implements RSScene if (checkClick && client.containsBounds(mouseX2, mouseY2, ax, bx, cx, ay, by, cy)) { setTargetTile(x, y); + + if (mouseX2 >= client.getViewportXOffset() && mouseX2 < client.getViewportXOffset() + client.getViewportWidth() && mouseY2 >= client.getViewportYOffset() && mouseY2 < client.getViewportYOffset() + client.getViewportHeight()) + { + hoverTile(x, y, tilePlane); + } } } @@ -516,6 +625,11 @@ public abstract class RSSceneMixin implements RSScene if (checkClick && client.containsBounds(mouseX2, mouseY2, dx, cx, bx, dy, cy, by)) { setTargetTile(x, y); + + if (mouseX2 >= client.getViewportXOffset() && mouseX2 < client.getViewportXOffset() + client.getViewportWidth() && mouseY2 >= client.getViewportYOffset() && mouseY2 < client.getViewportYOffset() + client.getViewportHeight()) + { + hoverTile(x, y, tilePlane); + } } } @@ -534,10 +648,17 @@ public abstract class RSSceneMixin implements RSScene @Replace("drawTileOverlay") public void copy$drawTileOverlay(SceneTileModel tile, int pitchSin, int pitchCos, int yawSin, int yawCos, int tileX, int tileY) { + Tile rsTile = getTiles()[client.getPlane()][tileX][tileY]; + final boolean checkClick = client.isCheckClick(); + if (!client.isGpu()) { copy$drawTileOverlay(tile, pitchSin, pitchCos, yawSin, yawCos, tileX, tileY); - return; + + if (rl$roofRemovalMode == 0 || !checkClick || rsTile == null || rsTile.getSceneTileModel() != tile || rsTile.getPhysicalLevel() != client.getPlane()) + { + return; + } } final DrawCallbacks drawCallbacks = client.getDrawCallbacks(); @@ -560,7 +681,6 @@ public abstract class RSSceneMixin implements RSScene tile, client.getPlane(), tileX, tileY, zoom, centerX, centerY); - final boolean checkClick = client.isCheckClick(); if (!checkClick) { return; @@ -624,6 +744,11 @@ public abstract class RSSceneMixin implements RSScene if (client.containsBounds(mouseX2, mouseY2, y1, y2, y3, x1, x2, x3)) { setTargetTile(tileX, tileY); + + if (rsTile != null && tile == rsTile.getSceneTileModel() && mouseX2 >= client.getViewportXOffset() && mouseX2 < client.getViewportXOffset() + client.getViewportWidth() && mouseY2 >= client.getViewportYOffset() && mouseY2 < client.getViewportYOffset() + client.getViewportHeight()) + { + hoverTile(tileX, tileY, rsTile.getPhysicalLevel()); + } break; } } @@ -727,9 +852,9 @@ public abstract class RSSceneMixin implements RSScene @MethodHook(value = "addTile", end = true) @Inject public void rl$addTile(int z, int x, int y, int shape, int rotation, int texture, int heightSw, int heightNw, - int heightNe, int heightSe, int underlaySwColor, int underlayNwColor, int underlayNeColor, - int underlaySeColor, int overlaySwColor, int overlayNwColor, int overlayNeColor, - int overlaySeColor, int underlayRgb, int overlayRgb) + int heightNe, int heightSe, int underlaySwColor, int underlayNwColor, int underlayNeColor, + int underlaySeColor, int overlaySwColor, int overlayNwColor, int overlayNeColor, + int overlaySeColor, int underlayRgb, int overlayRgb) { if (shape != 0 && shape != 1) { @@ -781,7 +906,7 @@ public abstract class RSSceneMixin implements RSScene { if (sceneTilePaint.getTexture() == -1) { - pixels[pixelOffset] = colorPalette[hs | seLightness >> 2]; + pixels[pixelOffset] = colorPalette[hs | seLightness >> 2]; pixels[pixelOffset + 1] = colorPalette[hs | seLightness * 3 + neLightness >> 4]; pixels[pixelOffset + 2] = colorPalette[hs | seLightness + neLightness >> 3]; pixels[pixelOffset + 3] = colorPalette[hs | seLightness + neLightness * 3 >> 4]; @@ -970,4 +1095,98 @@ public abstract class RSSceneMixin implements RSScene } } } + + @Inject + @Override + public void setRoofRemovalMode(int roofRemovalMode) + { + rl$roofRemovalMode = roofRemovalMode; + } + + @Inject + @Override + public void generateHouses() + { + rl$tiles = new int[4][104][104]; + final Tile[][][] tiles = getTiles(); + int var2 = 1; + + for (int plane = 0; plane < 4; ++plane) + { + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[plane][x][y]; + if (tile != null && rl$tiles[plane][x][y] == 0 && blocking(plane, x, y)) + { + this.iterateDeque(tile, var2); + ++var2; + } + } + } + } + } + + @Inject + public void iterateDeque(Tile var1, int var2) + { + Tile[][][] tiles = getTiles(); + RSNodeDeque tilesDeque = client.getTilesDeque(); + tilesDeque.addFirst((RSNode) var1); + + RSTile rsTile; + while ((rsTile = (RSTile) tilesDeque.removeLast()) != null) + { + int x = rsTile.getX(); + int y = rsTile.getY(); + int plane = rsTile.getPlane(); + if (rl$tiles[plane][x][y] == 0) + { + if (blocking(plane, x, y)) + { + neighbourTile(tilesDeque, tiles, plane, x - 1, y); + neighbourTile(tilesDeque, tiles, plane, x + 1, y); + neighbourTile(tilesDeque, tiles, plane, x, y - 1); + neighbourTile(tilesDeque, tiles, plane, x, y + 1); + neighbourTile(tilesDeque, tiles, plane, x - 1, y - 1); + neighbourTile(tilesDeque, tiles, plane, x + 1, y - 1); + neighbourTile(tilesDeque, tiles, plane, x - 1, y + 1); + neighbourTile(tilesDeque, tiles, plane, x + 1, y + 1); + } + + rl$tiles[plane][x][y] = var2; + } + } + + } + + @Inject + public static boolean blocking(int plane, int x, int y) + { + return (client.getTileSettings()[plane][x][y] & 4) != 0; + } + + @Inject + public static void neighbourTile(RSNodeDeque rsNodeDeque, Tile[][][] tiles, int plane, int x, int y) + { + if (x >= 0 && x < 104 && y >= 0 && y < 104) + { + Tile tile = tiles[plane][x][y]; + if (tile != null) + { + rsNodeDeque.addFirst((RSNode) tile); + } + } + } + + @Inject + public static void hoverTile(int x, int y, int plane) + { + if (plane == client.getPlane() && !client.isMenuOpen()) + { + rl$hoverX = x; + rl$hoverY = y; + } + } } \ No newline at end of file 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 a6312ac5f4..16c462d8de 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 @@ -243,6 +243,9 @@ public interface RSClient extends RSGameEngine, Client @Import("combatTargetPlayerIndex") void setLocalInteractingIndex(int idx); + @Import("Scene_tilesDeque") + RSNodeDeque getTilesDeque(); + @Import("groundItems") RSNodeDeque[][][] getGroundItemDeque(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java index 9649eff62e..a1f0c9c2dc 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java @@ -42,4 +42,7 @@ public interface RSNodeDeque @Import("addFirst") void addFirst(RSNode val); + + @Import("removeLast") + RSNode removeLast(); } From 69b594fd8b87d7e5270df4ffd1495a67b07446de Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sun, 12 Sep 2021 00:19:06 +0200 Subject: [PATCH 07/16] project: Move MacOSPopupFactory --- .../client/util/MacOSPopupFactory.java | 12 +++++- .../client/util/MacOSPopupFactory.java | 42 ------------------- 2 files changed, 10 insertions(+), 44 deletions(-) delete mode 100644 runelite-client/src/main/java11/net/runelite/client/util/MacOSPopupFactory.java diff --git a/runelite-client/src/main/java/net/runelite/client/util/MacOSPopupFactory.java b/runelite-client/src/main/java/net/runelite/client/util/MacOSPopupFactory.java index 8e9f14551a..62a91abed8 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/MacOSPopupFactory.java +++ b/runelite-client/src/main/java/net/runelite/client/util/MacOSPopupFactory.java @@ -24,11 +24,19 @@ */ package net.runelite.client.util; +import java.awt.Component; +import javax.swing.Popup; import javax.swing.PopupFactory; /** - * Dummy popup factory for Java 8 + * Popup factory for Java 11 which forces heavyweight popups. Lightweight popups do not render correctly + * over AWT canvases on OSX. */ class MacOSPopupFactory extends PopupFactory { -} + @Override + protected Popup getPopup(Component owner, Component contents, int x, int y, boolean isHeavyWeightPopup) throws IllegalArgumentException + { + return super.getPopup(owner, contents, x, y, true); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java11/net/runelite/client/util/MacOSPopupFactory.java b/runelite-client/src/main/java11/net/runelite/client/util/MacOSPopupFactory.java deleted file mode 100644 index 62a91abed8..0000000000 --- a/runelite-client/src/main/java11/net/runelite/client/util/MacOSPopupFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2021, 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.util; - -import java.awt.Component; -import javax.swing.Popup; -import javax.swing.PopupFactory; - -/** - * Popup factory for Java 11 which forces heavyweight popups. Lightweight popups do not render correctly - * over AWT canvases on OSX. - */ -class MacOSPopupFactory extends PopupFactory -{ - @Override - protected Popup getPopup(Component owner, Component contents, int x, int y, boolean isHeavyWeightPopup) throws IllegalArgumentException - { - return super.getPopup(owner, contents, x, y, true); - } -} \ No newline at end of file From 72b2ac5705c894f7e30f7296c73e310caee82b5d Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 15 Jul 2021 11:41:09 -0600 Subject: [PATCH 08/16] rl-client: add plugin conflict support --- .../client/plugins/PluginDescriptor.java | 15 +++++ .../client/plugins/PluginManager.java | 63 +++++++++++++++++++ .../client/plugins/config/ConfigPanel.java | 2 +- .../client/plugins/config/ConfigPlugin.java | 4 +- .../config/PluginConfigurationDescriptor.java | 11 ++++ .../client/plugins/config/PluginListItem.java | 2 +- .../plugins/config/PluginListPanel.java | 6 +- .../plugins/config/PluginToggleButton.java | 25 +++++++- 8 files changed, 121 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java index 0a3336d203..a555c36cf6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java @@ -53,6 +53,18 @@ public @interface PluginDescriptor */ String[] tags() default {}; + /** + * A list of plugin names that are mutually exclusive with this plugin. Any plugins + * with a name or conflicts value that matches this will be disabled when this plugin + * is started + */ + String[] conflicts() default {}; + + /** + * If this plugin should be defaulted to on. Plugin-Hub plugins should always + * have this set to true (the default), since having them off by defaults means + * the user has to install the plugin, then separately enable it, which is confusing. + */ boolean enabledByDefault() default true; /** @@ -62,6 +74,9 @@ public @interface PluginDescriptor boolean developerPlugin() default false; + /** + * If this plugin should be loaded when there is no {@link net.runelite.api.Client} + */ boolean loadWhenOutdated() default false; boolean loadInSafeMode() default true; 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 1549e5cb74..c9c88b669a 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 @@ -47,7 +47,9 @@ import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -380,6 +382,19 @@ public class PluginManager return false; } + List conflicts = conflictsForPlugin(plugin); + for (Plugin conflict : conflicts) + { + if (isPluginEnabled(conflict)) + { + setPluginEnabled(conflict, false); + } + if (activePlugins.contains(conflict)) + { + stopPlugin(conflict); + } + } + activePlugins.add(plugin); try @@ -445,6 +460,18 @@ public class PluginManager final PluginDescriptor pluginDescriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); final String keyName = Strings.isNullOrEmpty(pluginDescriptor.configName()) ? plugin.getClass().getSimpleName() : pluginDescriptor.configName(); configManager.setConfiguration(RuneLiteConfig.GROUP_NAME, keyName.toLowerCase(), String.valueOf(enabled)); + + if (enabled) + { + List conflicts = conflictsForPlugin(plugin); + for (Plugin conflict : conflicts) + { + if (isPluginEnabled(conflict)) + { + setPluginEnabled(conflict, false); + } + } + } } public boolean isPluginEnabled(Plugin plugin) @@ -638,4 +665,40 @@ public class PluginManager } return l; } + + public List conflictsForPlugin(Plugin plugin) + { + Set conflicts; + { + PluginDescriptor desc = plugin.getClass().getAnnotation(PluginDescriptor.class); + conflicts = new HashSet<>(Arrays.asList(desc.conflicts())); + conflicts.add(desc.name()); + } + + return plugins.stream() + .filter(p -> + { + if (p == plugin) + { + return false; + } + + PluginDescriptor desc = p.getClass().getAnnotation(PluginDescriptor.class); + if (conflicts.contains(desc.name())) + { + return true; + } + + for (String conflict : desc.conflicts()) + { + if (conflicts.contains(conflict)) + { + return true; + } + } + + return false; + }) + .collect(Collectors.toList()); + } } 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 f451debee8..aaa2a42b67 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 @@ -181,7 +181,7 @@ class ConfigPanel extends PluginPanel topPanelBackButton.setToolTipText("Back"); topPanel.add(topPanelBackButton, BorderLayout.WEST); - pluginToggle = new PluginToggleButton(); + pluginToggle = new PluginToggleButton(pluginConfig.getConflicts()); topPanel.add(pluginToggle, BorderLayout.EAST); title = new JLabel(); title.setForeground(Color.WHITE); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index 41372e3895..c8b8feefb5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -75,11 +75,11 @@ public class ConfigPlugin extends Plugin pluginListPanel.addFakePlugin(new PluginConfigurationDescriptor( "RuneLite", "RuneLite client settings", new String[]{"client", "notification", "size", "position", "window", "chrome", "focus", "font", "overlay", "tooltip", "infobox"}, - null, runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) + runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) ), new PluginConfigurationDescriptor( "Chat Color", "Recolor chat text", new String[]{"colour", "messages"}, - null, chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) + chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) )); pluginListPanel.rebuildPluginList(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java index 279991656b..1cba92649f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java @@ -24,8 +24,10 @@ */ package net.runelite.client.plugins.config; +import java.util.List; import javax.annotation.Nullable; import javax.swing.JMenuItem; +import lombok.RequiredArgsConstructor; import lombok.Value; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigDescriptor; @@ -35,6 +37,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.util.LinkBrowser; @Value +@RequiredArgsConstructor class PluginConfigurationDescriptor { private final String name; @@ -52,11 +55,19 @@ class PluginConfigurationDescriptor @Nullable private final ConfigDescriptor configDescriptor; + @Nullable + private final List conflicts; + boolean hasConfigurables() { return configDescriptor != null && !configDescriptor.getItems().stream().allMatch(item -> item.getItem().hidden()); } + PluginConfigurationDescriptor(String name, String description, String[] tags, Config config, ConfigDescriptor configDescriptor) + { + this(name, description, tags, null, config, configDescriptor, null); + } + /** * Creates a menu item for linking to a support page for the plugin * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index 767fddbc1a..ce49b44a14 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -166,7 +166,7 @@ class PluginListItem extends JPanel implements SearchablePlugin addLabelPopupMenu(nameLabel, configMenuItem, pluginConfig.createSupportMenuItem(), uninstallItem); add(nameLabel, BorderLayout.CENTER); - onOffToggle = new PluginToggleButton(); + onOffToggle = new PluginToggleButton(pluginConfig.getConflicts()); buttonPanel.add(onOffToggle); if (pluginConfig.getPlugin() != null) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java index a17e6af0c6..14a6ad1171 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java @@ -202,6 +202,9 @@ class PluginListPanel extends PluginPanel PluginDescriptor descriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); Config config = pluginManager.getPluginConfigProxy(plugin); ConfigDescriptor configDescriptor = config == null ? null : configManager.getConfigDescriptor(config); + List conflicts = pluginManager.conflictsForPlugin(plugin).stream() + .map(Plugin::getName) + .collect(Collectors.toList()); return new PluginConfigurationDescriptor( descriptor.name(), @@ -209,7 +212,8 @@ class PluginListPanel extends PluginPanel descriptor.tags(), plugin, config, - configDescriptor); + configDescriptor, + conflicts); }) ) .map(desc -> diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index 8de213ec56..f125eec9f8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.config; import java.awt.Dimension; import java.awt.image.BufferedImage; +import java.util.List; import javax.swing.ImageIcon; import javax.swing.JToggleButton; import net.runelite.client.util.ImageUtil; @@ -51,12 +52,32 @@ class PluginToggleButton extends JToggleButton )); } - public PluginToggleButton() + public PluginToggleButton(List conflicts) { super(OFF_SWITCHER); setSelectedIcon(ON_SWITCHER); SwingUtil.removeButtonDecorations(this); setPreferredSize(new Dimension(25, 0)); - SwingUtil.addModalTooltip(this, "Disable plugin", "Enable plugin"); + + String conflictString = ""; + if (conflicts != null && !conflicts.isEmpty()) + { + StringBuilder sb = new StringBuilder("
Conflicts with "); + for (int i = 0; i < conflicts.size() - 2; i++) + { + sb.append(conflicts.get(i)); + sb.append(", "); + } + if (conflicts.size() > 2) + { + sb.append(conflicts.get(conflicts.size() - 2)); + sb.append(" and "); + } + + sb.append(conflicts.get(conflicts.size() - 1)); + conflictString = sb.toString(); + } + + SwingUtil.addModalTooltip(this, "Disable plugin", "Enable plugin" + conflictString); } } From 62a9e4f79b3a402ccdd31681b665176cd4f04a03 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sat, 11 Sep 2021 19:33:34 -0600 Subject: [PATCH 09/16] Revert "rl-client: add plugin conflict support" This reverts commit 72b2ac5705c894f7e30f7296c73e310caee82b5d. --- .../client/plugins/PluginDescriptor.java | 15 ----- .../client/plugins/PluginManager.java | 63 ------------------- .../client/plugins/config/ConfigPanel.java | 2 +- .../client/plugins/config/ConfigPlugin.java | 4 +- .../config/PluginConfigurationDescriptor.java | 11 ---- .../client/plugins/config/PluginListItem.java | 2 +- .../plugins/config/PluginListPanel.java | 6 +- .../plugins/config/PluginToggleButton.java | 25 +------- 8 files changed, 7 insertions(+), 121 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java index a555c36cf6..0a3336d203 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java @@ -53,18 +53,6 @@ public @interface PluginDescriptor */ String[] tags() default {}; - /** - * A list of plugin names that are mutually exclusive with this plugin. Any plugins - * with a name or conflicts value that matches this will be disabled when this plugin - * is started - */ - String[] conflicts() default {}; - - /** - * If this plugin should be defaulted to on. Plugin-Hub plugins should always - * have this set to true (the default), since having them off by defaults means - * the user has to install the plugin, then separately enable it, which is confusing. - */ boolean enabledByDefault() default true; /** @@ -74,9 +62,6 @@ public @interface PluginDescriptor boolean developerPlugin() default false; - /** - * If this plugin should be loaded when there is no {@link net.runelite.api.Client} - */ boolean loadWhenOutdated() default false; boolean loadInSafeMode() default true; 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 c9c88b669a..1549e5cb74 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 @@ -47,9 +47,7 @@ import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -382,19 +380,6 @@ public class PluginManager return false; } - List conflicts = conflictsForPlugin(plugin); - for (Plugin conflict : conflicts) - { - if (isPluginEnabled(conflict)) - { - setPluginEnabled(conflict, false); - } - if (activePlugins.contains(conflict)) - { - stopPlugin(conflict); - } - } - activePlugins.add(plugin); try @@ -460,18 +445,6 @@ public class PluginManager final PluginDescriptor pluginDescriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); final String keyName = Strings.isNullOrEmpty(pluginDescriptor.configName()) ? plugin.getClass().getSimpleName() : pluginDescriptor.configName(); configManager.setConfiguration(RuneLiteConfig.GROUP_NAME, keyName.toLowerCase(), String.valueOf(enabled)); - - if (enabled) - { - List conflicts = conflictsForPlugin(plugin); - for (Plugin conflict : conflicts) - { - if (isPluginEnabled(conflict)) - { - setPluginEnabled(conflict, false); - } - } - } } public boolean isPluginEnabled(Plugin plugin) @@ -665,40 +638,4 @@ public class PluginManager } return l; } - - public List conflictsForPlugin(Plugin plugin) - { - Set conflicts; - { - PluginDescriptor desc = plugin.getClass().getAnnotation(PluginDescriptor.class); - conflicts = new HashSet<>(Arrays.asList(desc.conflicts())); - conflicts.add(desc.name()); - } - - return plugins.stream() - .filter(p -> - { - if (p == plugin) - { - return false; - } - - PluginDescriptor desc = p.getClass().getAnnotation(PluginDescriptor.class); - if (conflicts.contains(desc.name())) - { - return true; - } - - for (String conflict : desc.conflicts()) - { - if (conflicts.contains(conflict)) - { - return true; - } - } - - return false; - }) - .collect(Collectors.toList()); - } } 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 aaa2a42b67..f451debee8 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 @@ -181,7 +181,7 @@ class ConfigPanel extends PluginPanel topPanelBackButton.setToolTipText("Back"); topPanel.add(topPanelBackButton, BorderLayout.WEST); - pluginToggle = new PluginToggleButton(pluginConfig.getConflicts()); + pluginToggle = new PluginToggleButton(); topPanel.add(pluginToggle, BorderLayout.EAST); title = new JLabel(); title.setForeground(Color.WHITE); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index c8b8feefb5..41372e3895 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -75,11 +75,11 @@ public class ConfigPlugin extends Plugin pluginListPanel.addFakePlugin(new PluginConfigurationDescriptor( "RuneLite", "RuneLite client settings", new String[]{"client", "notification", "size", "position", "window", "chrome", "focus", "font", "overlay", "tooltip", "infobox"}, - runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) + null, runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) ), new PluginConfigurationDescriptor( "Chat Color", "Recolor chat text", new String[]{"colour", "messages"}, - chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) + null, chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) )); pluginListPanel.rebuildPluginList(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java index 1cba92649f..279991656b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java @@ -24,10 +24,8 @@ */ package net.runelite.client.plugins.config; -import java.util.List; import javax.annotation.Nullable; import javax.swing.JMenuItem; -import lombok.RequiredArgsConstructor; import lombok.Value; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigDescriptor; @@ -37,7 +35,6 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.util.LinkBrowser; @Value -@RequiredArgsConstructor class PluginConfigurationDescriptor { private final String name; @@ -55,19 +52,11 @@ class PluginConfigurationDescriptor @Nullable private final ConfigDescriptor configDescriptor; - @Nullable - private final List conflicts; - boolean hasConfigurables() { return configDescriptor != null && !configDescriptor.getItems().stream().allMatch(item -> item.getItem().hidden()); } - PluginConfigurationDescriptor(String name, String description, String[] tags, Config config, ConfigDescriptor configDescriptor) - { - this(name, description, tags, null, config, configDescriptor, null); - } - /** * Creates a menu item for linking to a support page for the plugin * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index ce49b44a14..767fddbc1a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -166,7 +166,7 @@ class PluginListItem extends JPanel implements SearchablePlugin addLabelPopupMenu(nameLabel, configMenuItem, pluginConfig.createSupportMenuItem(), uninstallItem); add(nameLabel, BorderLayout.CENTER); - onOffToggle = new PluginToggleButton(pluginConfig.getConflicts()); + onOffToggle = new PluginToggleButton(); buttonPanel.add(onOffToggle); if (pluginConfig.getPlugin() != null) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java index 14a6ad1171..a17e6af0c6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java @@ -202,9 +202,6 @@ class PluginListPanel extends PluginPanel PluginDescriptor descriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); Config config = pluginManager.getPluginConfigProxy(plugin); ConfigDescriptor configDescriptor = config == null ? null : configManager.getConfigDescriptor(config); - List conflicts = pluginManager.conflictsForPlugin(plugin).stream() - .map(Plugin::getName) - .collect(Collectors.toList()); return new PluginConfigurationDescriptor( descriptor.name(), @@ -212,8 +209,7 @@ class PluginListPanel extends PluginPanel descriptor.tags(), plugin, config, - configDescriptor, - conflicts); + configDescriptor); }) ) .map(desc -> diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index f125eec9f8..8de213ec56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.config; import java.awt.Dimension; import java.awt.image.BufferedImage; -import java.util.List; import javax.swing.ImageIcon; import javax.swing.JToggleButton; import net.runelite.client.util.ImageUtil; @@ -52,32 +51,12 @@ class PluginToggleButton extends JToggleButton )); } - public PluginToggleButton(List conflicts) + public PluginToggleButton() { super(OFF_SWITCHER); setSelectedIcon(ON_SWITCHER); SwingUtil.removeButtonDecorations(this); setPreferredSize(new Dimension(25, 0)); - - String conflictString = ""; - if (conflicts != null && !conflicts.isEmpty()) - { - StringBuilder sb = new StringBuilder("
Conflicts with "); - for (int i = 0; i < conflicts.size() - 2; i++) - { - sb.append(conflicts.get(i)); - sb.append(", "); - } - if (conflicts.size() > 2) - { - sb.append(conflicts.get(conflicts.size() - 2)); - sb.append(" and "); - } - - sb.append(conflicts.get(conflicts.size() - 1)); - conflictString = sb.toString(); - } - - SwingUtil.addModalTooltip(this, "Disable plugin", "Enable plugin" + conflictString); + SwingUtil.addModalTooltip(this, "Disable plugin", "Enable plugin"); } } From 24511aea4e50474768ab751e8214676af14e6dd8 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 15 Jul 2021 11:41:09 -0600 Subject: [PATCH 10/16] rl-client: add plugin conflict support --- .../client/plugins/PluginDescriptor.java | 15 +++++ .../client/plugins/PluginManager.java | 63 +++++++++++++++++++ .../client/plugins/config/ConfigPanel.java | 1 + .../client/plugins/config/ConfigPlugin.java | 4 +- .../config/PluginConfigurationDescriptor.java | 11 ++++ .../client/plugins/config/PluginListItem.java | 3 +- .../plugins/config/PluginListPanel.java | 6 +- .../plugins/config/PluginToggleButton.java | 38 ++++++++++- 8 files changed, 136 insertions(+), 5 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java index 0a3336d203..a555c36cf6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java @@ -53,6 +53,18 @@ public @interface PluginDescriptor */ String[] tags() default {}; + /** + * A list of plugin names that are mutually exclusive with this plugin. Any plugins + * with a name or conflicts value that matches this will be disabled when this plugin + * is started + */ + String[] conflicts() default {}; + + /** + * If this plugin should be defaulted to on. Plugin-Hub plugins should always + * have this set to true (the default), since having them off by defaults means + * the user has to install the plugin, then separately enable it, which is confusing. + */ boolean enabledByDefault() default true; /** @@ -62,6 +74,9 @@ public @interface PluginDescriptor boolean developerPlugin() default false; + /** + * If this plugin should be loaded when there is no {@link net.runelite.api.Client} + */ boolean loadWhenOutdated() default false; boolean loadInSafeMode() default true; 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 1549e5cb74..c9c88b669a 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 @@ -47,7 +47,9 @@ import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -380,6 +382,19 @@ public class PluginManager return false; } + List conflicts = conflictsForPlugin(plugin); + for (Plugin conflict : conflicts) + { + if (isPluginEnabled(conflict)) + { + setPluginEnabled(conflict, false); + } + if (activePlugins.contains(conflict)) + { + stopPlugin(conflict); + } + } + activePlugins.add(plugin); try @@ -445,6 +460,18 @@ public class PluginManager final PluginDescriptor pluginDescriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); final String keyName = Strings.isNullOrEmpty(pluginDescriptor.configName()) ? plugin.getClass().getSimpleName() : pluginDescriptor.configName(); configManager.setConfiguration(RuneLiteConfig.GROUP_NAME, keyName.toLowerCase(), String.valueOf(enabled)); + + if (enabled) + { + List conflicts = conflictsForPlugin(plugin); + for (Plugin conflict : conflicts) + { + if (isPluginEnabled(conflict)) + { + setPluginEnabled(conflict, false); + } + } + } } public boolean isPluginEnabled(Plugin plugin) @@ -638,4 +665,40 @@ public class PluginManager } return l; } + + public List conflictsForPlugin(Plugin plugin) + { + Set conflicts; + { + PluginDescriptor desc = plugin.getClass().getAnnotation(PluginDescriptor.class); + conflicts = new HashSet<>(Arrays.asList(desc.conflicts())); + conflicts.add(desc.name()); + } + + return plugins.stream() + .filter(p -> + { + if (p == plugin) + { + return false; + } + + PluginDescriptor desc = p.getClass().getAnnotation(PluginDescriptor.class); + if (conflicts.contains(desc.name())) + { + return true; + } + + for (String conflict : desc.conflicts()) + { + if (conflicts.contains(conflict)) + { + return true; + } + } + + return false; + }) + .collect(Collectors.toList()); + } } 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 f451debee8..7015d4b1c7 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 @@ -211,6 +211,7 @@ class ConfigPanel extends PluginPanel if (pluginConfig.getPlugin() != null) { + pluginToggle.setConflicts(pluginConfig.getConflicts()); pluginToggle.setSelected(pluginManager.isPluginEnabled(pluginConfig.getPlugin())); pluginToggle.addItemListener(i -> { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index 41372e3895..c8b8feefb5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -75,11 +75,11 @@ public class ConfigPlugin extends Plugin pluginListPanel.addFakePlugin(new PluginConfigurationDescriptor( "RuneLite", "RuneLite client settings", new String[]{"client", "notification", "size", "position", "window", "chrome", "focus", "font", "overlay", "tooltip", "infobox"}, - null, runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) + runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig) ), new PluginConfigurationDescriptor( "Chat Color", "Recolor chat text", new String[]{"colour", "messages"}, - null, chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) + chatColorConfig, configManager.getConfigDescriptor(chatColorConfig) )); pluginListPanel.rebuildPluginList(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java index 279991656b..1cba92649f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginConfigurationDescriptor.java @@ -24,8 +24,10 @@ */ package net.runelite.client.plugins.config; +import java.util.List; import javax.annotation.Nullable; import javax.swing.JMenuItem; +import lombok.RequiredArgsConstructor; import lombok.Value; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigDescriptor; @@ -35,6 +37,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.util.LinkBrowser; @Value +@RequiredArgsConstructor class PluginConfigurationDescriptor { private final String name; @@ -52,11 +55,19 @@ class PluginConfigurationDescriptor @Nullable private final ConfigDescriptor configDescriptor; + @Nullable + private final List conflicts; + boolean hasConfigurables() { return configDescriptor != null && !configDescriptor.getItems().stream().allMatch(item -> item.getItem().hidden()); } + PluginConfigurationDescriptor(String name, String description, String[] tags, Config config, ConfigDescriptor configDescriptor) + { + this(name, description, tags, null, config, configDescriptor, null); + } + /** * Creates a menu item for linking to a support page for the plugin * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index 767fddbc1a..64a4cc41b0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -69,7 +69,7 @@ class PluginListItem extends JPanel implements SearchablePlugin private final List keywords = new ArrayList<>(); private final JToggleButton pinButton; - private final JToggleButton onOffToggle; + private final PluginToggleButton onOffToggle; static { @@ -167,6 +167,7 @@ class PluginListItem extends JPanel implements SearchablePlugin add(nameLabel, BorderLayout.CENTER); onOffToggle = new PluginToggleButton(); + onOffToggle.setConflicts(pluginConfig.getConflicts()); buttonPanel.add(onOffToggle); if (pluginConfig.getPlugin() != null) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java index a17e6af0c6..14a6ad1171 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java @@ -202,6 +202,9 @@ class PluginListPanel extends PluginPanel PluginDescriptor descriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); Config config = pluginManager.getPluginConfigProxy(plugin); ConfigDescriptor configDescriptor = config == null ? null : configManager.getConfigDescriptor(config); + List conflicts = pluginManager.conflictsForPlugin(plugin).stream() + .map(Plugin::getName) + .collect(Collectors.toList()); return new PluginConfigurationDescriptor( descriptor.name(), @@ -209,7 +212,8 @@ class PluginListPanel extends PluginPanel descriptor.tags(), plugin, config, - configDescriptor); + configDescriptor, + conflicts); }) ) .map(desc -> diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index 8de213ec56..637fa189a6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.config; import java.awt.Dimension; import java.awt.image.BufferedImage; +import java.util.List; import javax.swing.ImageIcon; import javax.swing.JToggleButton; import net.runelite.client.util.ImageUtil; @@ -51,12 +52,47 @@ class PluginToggleButton extends JToggleButton )); } + private String conflictString = ""; + public PluginToggleButton() { super(OFF_SWITCHER); setSelectedIcon(ON_SWITCHER); SwingUtil.removeButtonDecorations(this); setPreferredSize(new Dimension(25, 0)); - SwingUtil.addModalTooltip(this, "Disable plugin", "Enable plugin"); + addItemListener(l -> updateTooltip()); + updateTooltip(); + } + + private void updateTooltip() + { + setToolTipText(isSelected() ? "Disable plugin" : "Enable plugin" + conflictString); + } + + public void setConflicts(List conflicts) + { + if (conflicts != null && !conflicts.isEmpty()) + { + StringBuilder sb = new StringBuilder("
Conflicts with "); + for (int i = 0; i < conflicts.size() - 2; i++) + { + sb.append(conflicts.get(i)); + sb.append(", "); + } + if (conflicts.size() > 2) + { + sb.append(conflicts.get(conflicts.size() - 2)); + sb.append(" and "); + } + + sb.append(conflicts.get(conflicts.size() - 1)); + conflictString = sb.toString(); + } + else + { + conflictString = ""; + } + + updateTooltip(); } } From 37654452c3107660180ac68e69defe9af5aea77a Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Sep 2021 19:39:47 -0400 Subject: [PATCH 11/16] api: add model vertex normals --- runelite-api/src/main/java/net/runelite/api/Model.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Model.java b/runelite-api/src/main/java/net/runelite/api/Model.java index 441577caea..5896e1d4eb 100644 --- a/runelite-api/src/main/java/net/runelite/api/Model.java +++ b/runelite-api/src/main/java/net/runelite/api/Model.java @@ -85,4 +85,8 @@ public interface Model extends Renderable int getXYZMag(); boolean isClickable(); + + int[] getVertexNormalsX(); + int[] getVertexNormalsY(); + int[] getVertexNormalsZ(); } From e56562f54ae3a47ead8dbe7f8c9c7346fe486f0b Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Sep 2021 19:40:13 -0400 Subject: [PATCH 12/16] api: add scene tile shapes, underlay, and overlay ids --- .../src/main/java/net/runelite/api/Scene.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Scene.java b/runelite-api/src/main/java/net/runelite/api/Scene.java index a3e170ae73..3a748c9f97 100644 --- a/runelite-api/src/main/java/net/runelite/api/Scene.java +++ b/runelite-api/src/main/java/net/runelite/api/Scene.java @@ -62,4 +62,22 @@ public interface Scene void generateHouses(); void setRoofRemovalMode(int flags); + + /** + * Get the underlay ids for the scene. The value stored is id + 1, with 0 for no underlay. + * @return + */ + byte[][][] getUnderlayIds(); + + /** + * Get the overlay ids for the scene. The value stored is id + 1, with 0 for no overlay. + * @return + */ + byte[][][] getOverlayIds(); + + /** + * Get the shapes of the tiles for the scene. + * @return + */ + byte[][][] getTileShapes(); } From 87c5873c029aba5184f6d00982d940289f9327da Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Sun, 12 Sep 2021 16:16:51 +0000 Subject: [PATCH 13/16] Release 1.7.24 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-jshell/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index c68e82c09e..9a117caac3 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index d1468bed56..199b68fe22 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 0935ddec71..11e052a90a 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index cf011d3de5..ea0236f6aa 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 8fa23d1f95..bf93edc6d2 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 Web Service diff --git a/pom.xml b/pom.xml index 49ae236651..6d6dd4a6f0 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 pom RuneLite @@ -61,7 +61,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.7.24 diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 4d04f82781..1945c3c170 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index da1746631b..71e85ae623 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 client diff --git a/runelite-jshell/pom.xml b/runelite-jshell/pom.xml index 097b5c8382..22bb8bbbbf 100644 --- a/runelite-jshell/pom.xml +++ b/runelite-jshell/pom.xml @@ -30,7 +30,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 jshell diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index bf059bda73..a7a2c0762c 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24-SNAPSHOT + 1.7.24 script-assembler-plugin From 4b2afca434bf1d99e668af3fa33061435302be07 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Sun, 12 Sep 2021 16:16:54 +0000 Subject: [PATCH 14/16] Bump for 1.7.25-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-jshell/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 9a117caac3..31341f318e 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 199b68fe22..85c96dee35 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 11e052a90a..687cb0961c 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index ea0236f6aa..93eb167f6c 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index bf93edc6d2..22ff46eb37 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index 6d6dd4a6f0..5b0bda7c60 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT pom RuneLite @@ -61,7 +61,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.7.24 + HEAD diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 1945c3c170..3918045d57 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 71e85ae623..e80f89611f 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT client diff --git a/runelite-jshell/pom.xml b/runelite-jshell/pom.xml index 22bb8bbbbf..53163dc2ee 100644 --- a/runelite-jshell/pom.xml +++ b/runelite-jshell/pom.xml @@ -30,7 +30,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT jshell diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index a7a2c0762c..40d93c994d 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.7.24 + 1.7.25-SNAPSHOT script-assembler-plugin From 638760057e50840cfaa6d6a85a4c85814d4cecb6 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 13 Sep 2021 03:58:54 +0200 Subject: [PATCH 15/16] project: Mixins for HD --- .../net/runelite/deob/DeobAnnotations.java | 14 +- .../net/runelite/mixins/RSClientMixin.java | 21 +++ .../net/runelite/mixins/RSModelDataMixin.java | 51 ++++++- .../net/runelite/mixins/RSModelMixin.java | 141 +++++++++++++++++- .../net/runelite/mixins/RSSceneMixin.java | 53 ++++++- .../java/net/runelite/rs/api/RSClient.java | 12 ++ .../java/net/runelite/rs/api/RSModel.java | 11 +- .../java/net/runelite/rs/api/RSModelData.java | 9 ++ .../net/runelite/rs/api/RSOAuthTokens.java | 3 + .../java/net/runelite/rs/api/RSScene.java | 9 ++ .../net/runelite/rs/api/RSVertexNormal.java | 14 +- runescape-client/src/main/java/Client.java | 62 ++++---- runescape-client/src/main/java/ModelData.java | 47 +++--- .../src/main/java/StructComposition.java | 6 +- runescape-client/src/main/java/Tiles.java | 16 +- runescape-client/src/main/java/class6.java | 3 +- 16 files changed, 395 insertions(+), 77 deletions(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSOAuthTokens.java diff --git a/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java b/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java index f2ee7438c4..b751a95af2 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java +++ b/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java @@ -77,7 +77,14 @@ public class DeobAnnotations @Nullable public static String getImplements(@NotNull ClassFile cf) { - return getStringValue(cf, IMPLEMENTS); + String stringValue = getStringValue(cf, IMPLEMENTS); + + if (stringValue != null) + { + stringValue = flatten(stringValue); + } + + return stringValue; } @Nullable @@ -114,4 +121,9 @@ public class DeobAnnotations final var a = an.findAnnotation(type); return a == null ? null : a.getValueString(); } + + public static String flatten(String className) + { + return className.substring(className.lastIndexOf('/') + 1); + } } 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 ceeaa0d32e..119fc17088 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -29,6 +29,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; @@ -2290,5 +2291,25 @@ public abstract class RSClientMixin implements RSClient @Inject public static RSArchive[] archives = new RSArchive[21]; + + @Inject + @FieldHook("rndHue") + public static void rndHue(int idx) + { + int rndHue = client.getRndHue(); + + if (rndHue >= -8 && rndHue <= 8) + { + RSScene scene = client.getScene(); + + byte[][][] underlays = client.getTileUnderlays(); + byte[][][] overlays = client.getTileOverlays(); + byte[][][] tileShapes = client.getTileShapes(); + + scene.setUnderlayIds(Arrays.copyOf(underlays, underlays.length)); + scene.setOverlayIds(Arrays.copyOf(overlays, overlays.length)); + scene.setTileShapes(Arrays.copyOf(tileShapes, tileShapes.length)); + } + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java index 40ade7bb30..15b1e4223f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java @@ -33,6 +33,7 @@ import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSModel; import net.runelite.rs.api.RSModelData; +import net.runelite.rs.api.RSVertexNormal; @Mixin(RSModelData.class) public abstract class RSModelDataMixin implements RSModelData @@ -43,6 +44,15 @@ public abstract class RSModelDataMixin implements RSModelData @Inject private float[] faceTextureUVCoordinates; + @Inject + private int[] vertexNormalsX; + + @Inject + private int[] vertexNormalsY; + + @Inject + private int[] vertexNormalsZ; + @Copy("toModel") @Replace("toModel") @SuppressWarnings("InfiniteRecursion") @@ -61,11 +71,50 @@ public abstract class RSModelDataMixin implements RSModelData computeTextureUVCoordinates(); } + vertexNormals(); + RSModel rsModel = (RSModel) model; + rsModel.setVertexNormalsX(vertexNormalsX); + rsModel.setVertexNormalsY(vertexNormalsY); + rsModel.setVertexNormalsZ(vertexNormalsZ); rsModel.setFaceTextureUVCoordinates(faceTextureUVCoordinates); return model; } + @Inject + public void vertexNormals() + { + RSVertexNormal[] vertexNormals = getVertexNormals(); + RSVertexNormal[] vertexVertices = getVertexVertices(); + + if (vertexNormals != null && vertexNormalsX == null) + { + int verticesCount = getVerticesCount(); + + vertexNormalsX = new int[verticesCount]; + vertexNormalsY = new int[verticesCount]; + vertexNormalsZ = new int[verticesCount]; + + for (int i = 0; i < verticesCount; ++i) + { + RSVertexNormal vertexNormal; + + if (vertexVertices != null && (vertexNormal = vertexVertices[i]) != null) + { + vertexNormalsX[i] = vertexNormal.getX(); + vertexNormalsY[i] = vertexNormal.getY(); + vertexNormalsZ[i] = vertexNormal.getZ(); + } + else if ((vertexNormal = vertexNormals[i]) != null) + { + vertexNormalsX[i] = vertexNormal.getX(); + vertexNormalsY[i] = vertexNormal.getY(); + vertexNormalsZ[i] = vertexNormal.getZ(); + } + } + } + } + @Inject public void computeTextureUVCoordinates() { @@ -171,6 +220,6 @@ public abstract class RSModelDataMixin implements RSModelData } } - this.faceTextureUVCoordinates = faceTextureUCoordinates; + faceTextureUVCoordinates = faceTextureUCoordinates; } } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java index e3e41629e0..f17215d244 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java @@ -63,13 +63,22 @@ public abstract class RSModelMixin implements RSModel @Inject private float[] rl$faceTextureUVCoordinates; + @Inject + private int[] rl$vertexNormalsX; + + @Inject + private int[] rl$vertexNormalsY; + + @Inject + private int[] rl$vertexNormalsZ; + @MethodHook(value = "", end = true) @Inject public void rl$init(RSModel[] models, int length) { - if (this.getFaceTextures() != null) + if (getFaceTextures() != null) { - int count = this.getTrianglesCount(); + int count = getTrianglesCount(); float[] uv = new float[count * 6]; int idx = 0; @@ -91,6 +100,8 @@ public abstract class RSModelMixin implements RSModel setFaceTextureUVCoordinates(uv); } + + vertexNormals(); } @Override @@ -154,6 +165,9 @@ public abstract class RSModelMixin implements RSModel if (model != null && model != this) { RSModel rsModel = (RSModel) model; + rsModel.setVertexNormalsX(rl$vertexNormalsX); + rsModel.setVertexNormalsY(rl$vertexNormalsY); + rsModel.setVertexNormalsZ(rl$vertexNormalsZ); rsModel.setFaceTextureUVCoordinates(rl$faceTextureUVCoordinates); } return model; @@ -176,6 +190,9 @@ public abstract class RSModelMixin implements RSModel { // Animated models are usually a shared Model instance that is global RSModel rsModel = (RSModel) sharedModel; + rsModel.setVertexNormalsX(rl$vertexNormalsX); + rsModel.setVertexNormalsY(rl$vertexNormalsY); + rsModel.setVertexNormalsZ(rl$vertexNormalsZ); rsModel.setFaceTextureUVCoordinates(rl$faceTextureUVCoordinates); } @@ -217,7 +234,7 @@ public abstract class RSModelMixin implements RSModel for (int i = 0; i < frame.getTransformCount(); i++) { int type = frame.getTransformTypes()[i]; - this.animate(skin.getTypes()[type], skin.getList()[type], frame.getTranslatorX()[i], + animate(skin.getTypes()[type], skin.getList()[type], frame.getTranslatorX()[i], frame.getTranslatorY()[i], frame.getTranslatorZ()[i]); } } @@ -316,10 +333,10 @@ public abstract class RSModelMixin implements RSModel @Inject public Shape getConvexHull(int localX, int localY, int orientation, int tileHeight) { - int[] x2d = new int[this.getVerticesCount()]; - int[] y2d = new int[this.getVerticesCount()]; + int[] x2d = new int[getVerticesCount()]; + int[] y2d = new int[getVerticesCount()]; - Perspective.modelToCanvas(client, this.getVerticesCount(), localX, localY, tileHeight, orientation, this.getVerticesX(), this.getVerticesZ(), this.getVerticesY(), x2d, y2d); + Perspective.modelToCanvas(client, getVerticesCount(), localX, localY, tileHeight, orientation, getVerticesX(), getVerticesZ(), getVerticesY(), x2d, y2d); return Jarvis.convexHull(x2d, y2d); } @@ -335,7 +352,7 @@ public abstract class RSModelMixin implements RSModel @Override public void setSceneId(int sceneId) { - this.rl$sceneId = sceneId; + rl$sceneId = sceneId; } @Inject @@ -377,6 +394,114 @@ public abstract class RSModelMixin implements RSModel @Override public void setFaceTextureUVCoordinates(float[] faceTextureUVCoordinates) { - this.rl$faceTextureUVCoordinates = faceTextureUVCoordinates; + rl$faceTextureUVCoordinates = faceTextureUVCoordinates; + } + + @Inject + public void vertexNormals() + { + if (rl$vertexNormalsX == null) + { + int verticesCount = getVerticesCount(); + + rl$vertexNormalsX = new int[verticesCount]; + rl$vertexNormalsY = new int[verticesCount]; + rl$vertexNormalsZ = new int[verticesCount]; + + int[] trianglesX = getTrianglesX(); + int[] trianglesY = getTrianglesY(); + int[] trianglesZ = getTrianglesZ(); + int[] verticesX = getVerticesX(); + int[] verticesY = getVerticesY(); + int[] verticesZ = getVerticesZ(); + + for (int i = 0; i < getTrianglesCount(); ++i) + { + int var9 = trianglesX[i]; + int var10 = trianglesY[i]; + int var11 = trianglesZ[i]; + + int var12 = verticesX[var10] - verticesX[var9]; + int var13 = verticesY[var10] - verticesY[var9]; + int var14 = verticesZ[var10] - verticesZ[var9]; + int var15 = verticesX[var11] - verticesX[var9]; + int var16 = verticesY[var11] - verticesY[var9]; + int var17 = verticesZ[var11] - verticesZ[var9]; + + int var18 = var13 * var17 - var16 * var14; + int var19 = var14 * var15 - var17 * var12; + + int var20; + for (var20 = var12 * var16 - var15 * var13; var18 > 8192 || var19 > 8192 || var20 > 8192 || var18 < -8192 || var19 < -8192 || var20 < -8192; var20 >>= 1) + { + var18 >>= 1; + var19 >>= 1; + } + + int var21 = (int) Math.sqrt(var18 * var18 + var19 * var19 + var20 * var20); + if (var21 <= 0) + { + var21 = 1; + } + + var18 = var18 * 256 / var21; + var19 = var19 * 256 / var21; + var20 = var20 * 256 / var21; + + rl$vertexNormalsX[var9] += var18; + rl$vertexNormalsY[var9] += var19; + rl$vertexNormalsZ[var9] += var20; + + rl$vertexNormalsX[var10] += var18; + rl$vertexNormalsY[var10] += var19; + rl$vertexNormalsZ[var10] += var20; + + rl$vertexNormalsX[var11] += var18; + rl$vertexNormalsY[var11] += var19; + rl$vertexNormalsZ[var11] += var20; + } + } + } + + @Inject + @Override + public int[] getVertexNormalsX() + { + return rl$vertexNormalsX; + } + + @Inject + @Override + public void setVertexNormalsX(int[] vertexNormalsX) + { + rl$vertexNormalsX = vertexNormalsX; + } + + @Inject + @Override + public int[] getVertexNormalsY() + { + return rl$vertexNormalsY; + } + + @Inject + @Override + public void setVertexNormalsY(int[] vertexNormalsY) + { + rl$vertexNormalsY = vertexNormalsY; + } + + @Inject + @Override + public int[] getVertexNormalsZ() + { + return rl$vertexNormalsZ; + } + + @Inject + @Override + public void setVertexNormalsZ(int[] vertexNormalsZ) + { + rl$vertexNormalsZ = vertexNormalsZ; } } \ No newline at end of file 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 56a52f8b1f..303bda7f90 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -99,6 +99,15 @@ public abstract class RSSceneMixin implements RSScene @Inject private static int rl$hoverY = -1; + @Inject + private static byte[][][] rl$underlayIds; + + @Inject + private static byte[][][] rl$overlayIds; + + @Inject + private static byte[][][] rl$tileShapes; + @Replace("draw") void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane) { @@ -1120,7 +1129,7 @@ public abstract class RSSceneMixin implements RSScene Tile tile = tiles[plane][x][y]; if (tile != null && rl$tiles[plane][x][y] == 0 && blocking(plane, x, y)) { - this.iterateDeque(tile, var2); + iterateDeque(tile, var2); ++var2; } } @@ -1189,4 +1198,46 @@ public abstract class RSSceneMixin implements RSScene rl$hoverY = y; } } + + @Inject + @Override + public byte[][][] getUnderlayIds() + { + return rl$underlayIds; + } + + @Inject + @Override + public void setUnderlayIds(byte[][][] underlayIds) + { + rl$underlayIds = underlayIds; + } + + @Inject + @Override + public byte[][][] getOverlayIds() + { + return rl$overlayIds; + } + + @Inject + @Override + public void setOverlayIds(byte[][][] overlayIds) + { + rl$overlayIds = overlayIds; + } + + @Inject + @Override + public byte[][][] getTileShapes() + { + return rl$tileShapes; + } + + @Inject + @Override + public void setTileShapes(byte[][][] tileShapes) + { + rl$tileShapes = tileShapes; + } } \ No newline at end of file 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 16c462d8de..e0fade4a9f 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 @@ -1439,4 +1439,16 @@ public interface RSClient extends RSGameEngine, Client @Import("readStringIntParameters") RSIterableNodeHashTable readStringIntParameters(RSBuffer buffer, RSIterableNodeHashTable table); + + @Import("rndHue") + int getRndHue(); + + @Import("Tiles_underlays") + byte[][][] getTileUnderlays(); + + @Import("Tiles_overlays") + byte[][][] getTileOverlays(); + + @Import("Tiles_shapes") + byte[][][] getTileShapes(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java index 8a3751d858..dd7b1ae9f9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java @@ -170,5 +170,14 @@ public interface RSModel extends RSRenderable, Model Shape getConvexHull(int localX, int localY, int orientation, int tileHeight); float[] getFaceTextureUVCoordinates(); - void setFaceTextureUVCoordinates(float[] rl$faceTextureUVCoordinates); + void setFaceTextureUVCoordinates(float[] faceTextureUVCoordinates); + + int[] getVertexNormalsX(); + void setVertexNormalsX(int[] vertexNormalsX); + + int[] getVertexNormalsY(); + void setVertexNormalsY(int[] vertexNormalsY); + + int[] getVertexNormalsZ(); + void setVertexNormalsZ(int[] vertexNormalsZ); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java index f05b004217..4a3a519641 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java @@ -42,4 +42,13 @@ public interface RSModelData extends RSRenderable @Import("textureRenderTypes") byte[] getTextureRenderTypes(); + + @Import("verticesCount") + int getVerticesCount(); + + @Import("vertexNormals") + RSVertexNormal[] getVertexNormals(); + + @Import("vertexVertices") + RSVertexNormal[] getVertexVertices(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSOAuthTokens.java b/runescape-api/src/main/java/net/runelite/rs/api/RSOAuthTokens.java new file mode 100644 index 0000000000..6bb3b4aec9 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSOAuthTokens.java @@ -0,0 +1,3 @@ +package net.runelite.rs.api; + +public interface RSOAuthTokens {} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java index fbfd4820a0..e4dda41f0d 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java @@ -55,4 +55,13 @@ public interface RSScene extends Scene @Import("removeGameObject") void removeGameObject(GameObject gameObject); + + byte[][][] getUnderlayIds(); + void setUnderlayIds(byte[][][] underlayIds); + + byte[][][] getOverlayIds(); + void setOverlayIds(byte[][][] overlayIds); + + byte[][][] getTileShapes(); + void setTileShapes(byte[][][] tileShapes); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSVertexNormal.java b/runescape-api/src/main/java/net/runelite/rs/api/RSVertexNormal.java index 94d346ad0c..97cea4748a 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSVertexNormal.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSVertexNormal.java @@ -1,3 +1,15 @@ package net.runelite.rs.api; -public interface RSVertexNormal {} +import net.runelite.mapping.Import; + +public interface RSVertexNormal +{ + @Import("x") + int getX(); + + @Import("y") + int getY(); + + @Import("z") + int getZ(); +} diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index 00bdfc08b4..918f12cbde 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -1860,9 +1860,9 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { class1.playPcmPlayers(); Tiles.Tiles_minPlane = 99; - class6.field13 = new byte[4][104][104]; - Tiles.field974 = new byte[4][104][104]; - Tiles.field978 = new byte[4][104][104]; + class6.Tiles_underlays = new byte[4][104][104]; + Tiles.Tiles_overlays = new byte[4][104][104]; + Tiles.Tiles_shapes = new byte[4][104][104]; Tiles.field977 = new byte[4][104][104]; class113.field1367 = new int[4][105][105]; FloorUnderlayDefinition.field1769 = new byte[4][105][105]; @@ -2233,22 +2233,22 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { } } - Tiles.field987 += (int)(Math.random() * 5.0D) - 2; - if (Tiles.field987 < -8) { - Tiles.field987 = -8; + Tiles.rndHue += (int)(Math.random() * 5.0D) - 2; + if (Tiles.rndHue < -8) { + Tiles.rndHue = -8; } - if (Tiles.field987 > 8) { - Tiles.field987 = 8; + if (Tiles.rndHue > 8) { + Tiles.rndHue = 8; } - Tiles.field988 += (int)(Math.random() * 5.0D) - 2; - if (Tiles.field988 < -16) { - Tiles.field988 = -16; + Tiles.rndLightness += (int)(Math.random() * 5.0D) - 2; + if (Tiles.rndLightness < -16) { + Tiles.rndLightness = -16; } - if (Tiles.field988 > 16) { - Tiles.field988 = 16; + if (Tiles.rndLightness > 16) { + Tiles.rndLightness = 16; } int var59; @@ -2286,7 +2286,7 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { var16 = var14 + 5; int var10002; if (var16 >= 0 && var16 < 104) { - var17 = class6.field13[var53][var16][var15] & 255; + var17 = class6.Tiles_underlays[var53][var16][var15] & 255; if (var17 > 0) { FloorUnderlayDefinition var76 = TaskHandler.method2740(var17 - 1); var10000 = DirectByteArrayCopier.Tiles_hue; @@ -2303,7 +2303,7 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { var17 = var14 - 5; if (var17 >= 0 && var17 < 104) { - var59 = class6.field13[var53][var17][var15] & 255; + var59 = class6.Tiles_underlays[var53][var17][var15] & 255; if (var59 > 0) { FloorUnderlayDefinition var77 = TaskHandler.method2740(var59 - 1); var10000 = DirectByteArrayCopier.Tiles_hue; @@ -2350,8 +2350,8 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { Tiles.Tiles_minPlane = var53; } - var23 = class6.field13[var53][var14][var61] & 255; - var24 = Tiles.field974[var53][var14][var61] & 255; + var23 = class6.Tiles_underlays[var53][var14][var61] & 255; + var24 = Tiles.Tiles_overlays[var53][var14][var61] & 255; if (var23 > 0 || var24 > 0) { var25 = Tiles.Tiles_heights[var53][var14][var61]; var26 = Tiles.Tiles_heights[var53][var14 + 1][var61]; @@ -2368,8 +2368,8 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { var36 = var16 / var60; var37 = var17 / var60; var33 = PlatformInfo.hslToRgb(var35, var36, var37); - var35 = var35 + Tiles.field987 & 255; - var37 += Tiles.field988; + var35 = var35 + Tiles.rndHue & 255; + var37 += Tiles.rndLightness; if (var37 < 0) { var37 = 0; } else if (var37 > 255) { @@ -2382,7 +2382,7 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { FloorOverlayDefinition var63; if (var53 > 0) { boolean var79 = true; - if (var23 == 0 && Tiles.field978[var53][var14][var61] != 0) { + if (var23 == 0 && Tiles.Tiles_shapes[var53][var14][var61] != 0) { var79 = false; } @@ -2423,7 +2423,7 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { if (var24 == 0) { var72.addTile(var53, var14, var61, 0, 0, -1, var25, var26, var27, var28, WorldMapCacheName.method3873(var33, var29), WorldMapCacheName.method3873(var33, var30), WorldMapCacheName.method3873(var33, var62), WorldMapCacheName.method3873(var33, var32), 0, 0, 0, 0, var35, 0); } else { - var36 = Tiles.field978[var53][var14][var61] + 1; + var36 = Tiles.Tiles_shapes[var53][var14][var61] + 1; byte var80 = Tiles.field977[var53][var14][var61]; var39 = var24 - 1; FloorOverlayDefinition var66 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var39); @@ -2451,8 +2451,8 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { var43 = -2; } else { var42 = PlatformInfo.hslToRgb(var63.hue, var63.saturation, var63.lightness); - var44 = var63.hue + Tiles.field987 & 255; - var45 = var63.lightness + Tiles.field988; + var44 = var63.hue + Tiles.rndHue & 255; + var45 = var63.lightness + Tiles.rndLightness; if (var45 < 0) { var45 = 0; } else if (var45 > 255) { @@ -2468,8 +2468,8 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { } if (var63.secondaryRgb != -1) { - var45 = var63.secondaryHue + Tiles.field987 & 255; - var46 = var63.secondaryLightness + Tiles.field988; + var45 = var63.secondaryHue + Tiles.rndHue & 255; + var46 = var63.secondaryLightness + Tiles.rndLightness; if (var46 < 0) { var46 = 0; } else if (var46 > 255) { @@ -2494,9 +2494,9 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { } } - class6.field13[var53] = null; - Tiles.field974[var53] = null; - Tiles.field978[var53] = null; + class6.Tiles_underlays[var53] = null; + Tiles.Tiles_overlays[var53] = null; + Tiles.Tiles_shapes[var53] = null; Tiles.field977[var53] = null; FloorUnderlayDefinition.field1769[var53] = null; } @@ -2727,9 +2727,9 @@ public final class Client extends GameEngine implements Usernamed, OAuthTokens { HealthBarUpdate.updateGameState(30); class1.playPcmPlayers(); - class6.field13 = null; - Tiles.field974 = null; - Tiles.field978 = null; + class6.Tiles_underlays = null; + Tiles.Tiles_overlays = null; + Tiles.Tiles_shapes = null; Tiles.field977 = null; class113.field1367 = null; FloorUnderlayDefinition.field1769 = null; diff --git a/runescape-client/src/main/java/ModelData.java b/runescape-client/src/main/java/ModelData.java index 410102b62f..a1976e2f85 100644 --- a/runescape-client/src/main/java/ModelData.java +++ b/runescape-client/src/main/java/ModelData.java @@ -106,7 +106,8 @@ public class ModelData extends Renderable { @ObfuscatedSignature( descriptor = "[Lhc;" ) - VertexNormal[] field2257; + @Export("vertexVertices") + VertexNormal[] vertexVertices; @ObfuscatedName("ad") @Export("ambient") public short ambient; @@ -375,7 +376,7 @@ public class ModelData extends Renderable { this.faceLabelsAlpha = var1.faceLabelsAlpha; this.vertexNormals = var1.vertexNormals; this.faceNormals = var1.faceNormals; - this.field2257 = var1.field2257; + this.vertexVertices = var1.vertexVertices; this.ambient = var1.ambient; this.contrast = var1.contrast; } @@ -1386,7 +1387,7 @@ public class ModelData extends Renderable { @Export("invalidate") void invalidate() { this.vertexNormals = null; - this.field2257 = null; + this.vertexVertices = null; this.faceNormals = null; this.isBoundsCalculated = false; } @@ -1542,24 +1543,24 @@ public class ModelData extends Renderable { } } else { int var15 = this.faceColors[var16] & '\uffff'; - if (this.field2257 != null && this.field2257[this.indices1[var16]] != null) { - var13 = this.field2257[this.indices1[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices1[var16]] != null) { + var13 = this.vertexVertices[this.indices1[var16]]; } else { var13 = this.vertexNormals[this.indices1[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; var8.faceColors1[var16] = method3974(var15, var14); - if (this.field2257 != null && this.field2257[this.indices2[var16]] != null) { - var13 = this.field2257[this.indices2[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices2[var16]] != null) { + var13 = this.vertexVertices[this.indices2[var16]]; } else { var13 = this.vertexNormals[this.indices2[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; var8.faceColors2[var16] = method3974(var15, var14); - if (this.field2257 != null && this.field2257[this.indices3[var16]] != null) { - var13 = this.field2257[this.indices3[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices3[var16]] != null) { + var13 = this.vertexVertices[this.indices3[var16]]; } else { var13 = this.vertexNormals[this.indices3[var16]]; } @@ -1577,24 +1578,24 @@ public class ModelData extends Renderable { var8.faceColors3[var16] = -2; } } else { - if (this.field2257 != null && this.field2257[this.indices1[var16]] != null) { - var13 = this.field2257[this.indices1[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices1[var16]] != null) { + var13 = this.vertexVertices[this.indices1[var16]]; } else { var13 = this.vertexNormals[this.indices1[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; var8.faceColors1[var16] = method3975(var14); - if (this.field2257 != null && this.field2257[this.indices2[var16]] != null) { - var13 = this.field2257[this.indices2[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices2[var16]] != null) { + var13 = this.vertexVertices[this.indices2[var16]]; } else { var13 = this.vertexNormals[this.indices2[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; var8.faceColors2[var16] = method3975(var14); - if (this.field2257 != null && this.field2257[this.indices3[var16]] != null) { - var13 = this.field2257[this.indices3[var16]]; + if (this.vertexVertices != null && this.vertexVertices[this.indices3[var16]] != null) { + var13 = this.vertexVertices[this.indices3[var16]]; } else { var13 = this.vertexNormals[this.indices3[var16]]; } @@ -1659,22 +1660,22 @@ public class ModelData extends Renderable { for (int var14 = 0; var14 < var8; ++var14) { VertexNormal var15 = var1.vertexNormals[var14]; if (var12 == var7[var14] && var13 == var1.verticesZ[var14] && var11 == var1.verticesY[var14] && var15.magnitude != 0) { - if (var0.field2257 == null) { - var0.field2257 = new VertexNormal[var0.verticesCount]; + if (var0.vertexVertices == null) { + var0.vertexVertices = new VertexNormal[var0.verticesCount]; } - if (var1.field2257 == null) { - var1.field2257 = new VertexNormal[var8]; + if (var1.vertexVertices == null) { + var1.vertexVertices = new VertexNormal[var8]; } - VertexNormal var16 = var0.field2257[var9]; + VertexNormal var16 = var0.vertexVertices[var9]; if (var16 == null) { - var16 = var0.field2257[var9] = new VertexNormal(var10); + var16 = var0.vertexVertices[var9] = new VertexNormal(var10); } - VertexNormal var17 = var1.field2257[var14]; + VertexNormal var17 = var1.vertexVertices[var14]; if (var17 == null) { - var17 = var1.field2257[var14] = new VertexNormal(var15); + var17 = var1.vertexVertices[var14] = new VertexNormal(var15); } var16.x += var15.x; diff --git a/runescape-client/src/main/java/StructComposition.java b/runescape-client/src/main/java/StructComposition.java index 2574b4eddf..f349fdf463 100644 --- a/runescape-client/src/main/java/StructComposition.java +++ b/runescape-client/src/main/java/StructComposition.java @@ -177,13 +177,13 @@ public class StructComposition extends DualNode { } if (var7 <= 49) { - Tiles.field974[var1][var2][var3] = var0.readByte(); - Tiles.field978[var1][var2][var3] = (byte)((var7 - 2) / 4); + Tiles.Tiles_overlays[var1][var2][var3] = var0.readByte(); + Tiles.Tiles_shapes[var1][var2][var3] = (byte)((var7 - 2) / 4); Tiles.field977[var1][var2][var3] = (byte)(var7 - 2 + var6 & 3); } else if (var7 <= 81) { Tiles.Tiles_renderFlags[var1][var2][var3] = (byte)(var7 - 49); } else { - class6.field13[var1][var2][var3] = (byte)(var7 - 81); + class6.Tiles_underlays[var1][var2][var3] = (byte)(var7 - 81); } } } else { diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index 9aa4e0beed..71c44815ee 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -21,9 +21,11 @@ public final class Tiles { @Export("Tiles_minPlane") static int Tiles_minPlane; @ObfuscatedName("o") - static byte[][][] field974; + @Export("Tiles_overlays") + static byte[][][] Tiles_overlays; @ObfuscatedName("g") - static byte[][][] field978; + @Export("Tiles_shapes") + static byte[][][] Tiles_shapes; @ObfuscatedName("z") static byte[][][] field977; @ObfuscatedName("y") @@ -48,12 +50,14 @@ public final class Tiles { @ObfuscatedGetter( intValue = -416490741 ) - static int field987; + @Export("rndHue") + static int rndHue; @ObfuscatedName("i") @ObfuscatedGetter( intValue = -2134339611 ) - static int field988; + @Export("rndLightness") + static int rndLightness; @ObfuscatedName("ix") @ObfuscatedGetter( intValue = 1521226335 @@ -71,8 +75,8 @@ public final class Tiles { field984 = new int[]{0, -1, 0, 1}; field985 = new int[]{1, -1, -1, 1}; field973 = new int[]{-1, -1, 1, 1}; - field987 = (int)(Math.random() * 17.0D) - 8; - field988 = (int)(Math.random() * 33.0D) - 16; + rndHue = (int)(Math.random() * 17.0D) - 8; + rndLightness = (int)(Math.random() * 33.0D) - 16; } @ObfuscatedName("a") diff --git a/runescape-client/src/main/java/class6.java b/runescape-client/src/main/java/class6.java index 8fd4a51777..ccebe6731a 100644 --- a/runescape-client/src/main/java/class6.java +++ b/runescape-client/src/main/java/class6.java @@ -12,7 +12,8 @@ public enum class6 implements MouseWheel { field10(0, 0); @ObfuscatedName("k") - static byte[][][] field13; + @Export("Tiles_underlays") + static byte[][][] Tiles_underlays; @ObfuscatedName("c") @ObfuscatedGetter( intValue = -607968475 From 6e37d6dbf691eaf952de89ebc54df0d0502c52d0 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 13 Sep 2021 08:41:29 +0200 Subject: [PATCH 16/16] project: Bump versions --- buildSrc/src/main/kotlin/Dependencies.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 5fb002187c..921e78f596 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -25,9 +25,9 @@ object ProjectVersions { const val launcherVersion = "2.2.0" - const val rlVersion = "1.7.23" + const val rlVersion = "1.7.24" - const val openosrsVersion = "4.9.14" + const val openosrsVersion = "4.10.0" const val rsversion = 199 const val cacheversion = 165