diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index cf25f764cb..e9906b8f04 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -27,7 +27,7 @@ object ProjectVersions { const val launcherVersion = "2.2.0" const val rlVersion = "1.8.0" - const val openosrsVersion = "4.13.3" + const val openosrsVersion = "4.14.0" const val rsversion = 200 const val cacheversion = 165 diff --git a/deobfuscator/src/main/java/net/runelite/deob/Deob.java b/deobfuscator/src/main/java/net/runelite/deob/Deob.java index ae6e4a71a5..f7dbc1c360 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/Deob.java +++ b/deobfuscator/src/main/java/net/runelite/deob/Deob.java @@ -77,7 +77,7 @@ public class Deob Stopwatch stopwatch = Stopwatch.createStarted(); - ClassGroup group = JarUtil.load(new File(args[0])); + ClassGroup group = JarUtil.load(new File(args[0]), true); // remove except RuntimeException run(group, new RuntimeExceptions()); diff --git a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java index eeac2fdf71..4af06497c3 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java +++ b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java @@ -50,6 +50,11 @@ public class JarUtil private static final Logger logger = LoggerFactory.getLogger(JarUtil.class); public static ClassGroup load(File jarfile) + { + return load(jarfile, false); + } + + public static ClassGroup load(File jarfile, boolean skip) { ClassGroup group = new ClassGroup(); @@ -59,7 +64,7 @@ public class JarUtil { JarEntry entry = it.nextElement(); - if (!entry.getName().endsWith(".class")) + if (!entry.getName().endsWith(".class") || (skip && entry.getName().contains("bouncycastle"))) { continue; } @@ -93,12 +98,17 @@ public class JarUtil } public static ClassGroup loadClasses(Collection files) throws IOException + { + return loadClasses(files, false); + } + + public static ClassGroup loadClasses(Collection files, boolean skip) throws IOException { final ClassGroup group = new ClassGroup(); for (File file : files) { - if (!file.getName().endsWith(".class")) + if (!file.getName().endsWith(".class") || (skip && file.getName().contains("bouncycastle"))) { continue; } 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 6060896e9c..5c78c2108f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1548,9 +1548,9 @@ public abstract class RSClientMixin implements RSClient return WorldType.fromMask(flags); } - @Inject - @MethodHook("openMenu") - public void menuOpened(int x, int y) + @Copy("openMenu") + @Replace("openMenu") + public void copy$openMenu(int x, int y) { final MenuOpened event = new MenuOpened(); event.setMenuEntries(getMenuEntries()); @@ -1560,6 +1560,10 @@ public abstract class RSClientMixin implements RSClient { setMenuEntries(event.getMenuEntries()); } + + copy$openMenu(x, y); + + client.getScene().menuOpen(client.getPlane(), x - client.getViewportXOffset(), y - client.getViewportYOffset(), false); } @Inject @@ -2435,8 +2439,7 @@ public abstract class RSClientMixin implements RSClient @Inject public void setUnlockedFps(boolean unlocked) { - // unlockedFps = unlocked; - unlockedFps = false; + unlockedFps = unlocked; if (unlocked) { diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java index 2d71583b6a..54f255d6a4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java @@ -48,15 +48,18 @@ public abstract class RSNanoClockMixin implements RSNanoClock else { long nanoTime = System.nanoTime(); + if (nanoTime < getLastTimeNano()) { setLastTimeNano(nanoTime); + return 1; } else { long cycleDuration = (long) cycleDurationMillis * 1000000L; long diff = nanoTime - getLastTimeNano(); + int cycles = (int) (diff / cycleDuration); setLastTimeNano(getLastTimeNano() + (long) cycles * cycleDuration); 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 6273fe8f56..46fe155ce6 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -122,28 +122,22 @@ public abstract class RSSceneMixin implements RSScene final boolean isGpu = client.isGpu(); final boolean checkClick = client.isCheckClick(); - if (!client.isMenuOpen()) + final boolean menuOpen = client.isMenuOpen(); + + if (!menuOpen && !checkClick) { - // Force check click to update the selected tile - client.setCheckClick(true); - final int mouseX = client.getMouseX(); - final int mouseY = client.getMouseY(); - client.setMouseCanvasHoverPositionX(mouseX - client.getViewportXOffset()); - client.setMouseCanvasHoverPositionY(mouseY - client.getViewportYOffset()); + client.getScene().menuOpen(client.getPlane(), client.getMouseX() - client.getViewportXOffset(), client.getMouseY() - client.getViewportYOffset(), false); } - if (!isGpu) + if (!isGpu && skyboxColor != 0) { - if (skyboxColor != 0) - { - client.rasterizerFillRectangle( - client.getViewportXOffset(), - client.getViewportYOffset(), - client.getViewportWidth(), - client.getViewportHeight(), - skyboxColor - ); - } + client.rasterizerFillRectangle( + client.getViewportXOffset(), + client.getViewportYOffset(), + client.getViewportWidth(), + client.getViewportHeight(), + skyboxColor + ); } final int maxX = getMaxX(); @@ -305,7 +299,7 @@ public abstract class RSSceneMixin implements RSScene } } - if (!client.isMenuOpen()) + if (!menuOpen) { rl$hoverY = -1; rl$hoverX = -1; @@ -408,10 +402,6 @@ public abstract class RSSceneMixin implements RSScene client.setEntitiesAtMouseCount(0); } client.setCheckClick(false); - if (!checkClick) - { - client.setViewportWalking(false); - } client.getCallbacks().drawScene(); if (client.getDrawCallbacks() != null) @@ -497,12 +487,6 @@ public abstract class RSSceneMixin implements RSScene client.setEntitiesAtMouseCount(0); } client.setCheckClick(false); - if (!checkClick) - { - // If checkClick was false, then the selected tile wouldn't have existed next tick, - // so clear viewport walking in order to prevent it triggering a walk - client.setViewportWalking(false); - } client.getCallbacks().drawScene(); if (client.getDrawCallbacks() != null) { 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 af1f331fe9..65c7faeea4 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 @@ -85,4 +85,7 @@ public interface RSScene extends Scene byte[][][] getTileShapes(); void setTileShapes(byte[][][] tileShapes); + + @Import("menuOpen") + void menuOpen(int selectedPlane, int screenX, int screenY, boolean viewportWalking); }