From 76f8cdaef184cb0ac5ba7ca02a89197684116a87 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 17 Nov 2021 17:08:54 +0100 Subject: [PATCH] project: Mixins --- .../net/runelite/mixins/RSClientMixin.java | 27 ++++++++++ .../net/runelite/mixins/RSNanoClockMixin.java | 52 ++++++++++++++++--- .../java/net/runelite/rs/api/RSClient.java | 2 + 3 files changed, 73 insertions(+), 8 deletions(-) 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 5c78c2108f..1885cb949f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -282,6 +282,9 @@ public abstract class RSClientMixin implements RSClient @Inject public long lastNanoTime; + @Inject + public long delayNanoTime; + @Inject private List outdatedScripts = new ArrayList<>(); @@ -2445,6 +2448,30 @@ public abstract class RSClientMixin implements RSClient { posToCameraAngle(client.getMapAngle(), client.getCameraPitch()); } + else + { + delayNanoTime = 0L; + } + } + + @Inject + public void setUnlockedFpsTarget(int var1) + { + if (var1 <= 0) + { + delayNanoTime = 0L; + } + else + { + delayNanoTime = 1000000000L / (long) var1; + } + } + + @Inject + @Override + public long getUnlockedFpsTarget() + { + return delayNanoTime; } @Inject 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 54f255d6a4..809aac00f7 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNanoClockMixin.java @@ -25,6 +25,7 @@ package net.runelite.mixins; import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; @@ -37,6 +38,9 @@ public abstract class RSNanoClockMixin implements RSNanoClock @Shadow("client") private static RSClient client; + @Inject + private long tmpNanoTime; + @Copy("wait") @Replace("wait") public int copy$wait(int cycleDurationMillis, int var2) @@ -49,16 +53,42 @@ public abstract class RSNanoClockMixin implements RSNanoClock { long nanoTime = System.nanoTime(); - if (nanoTime < getLastTimeNano()) + if (nanoTime >= getLastTimeNano() && nanoTime >= tmpNanoTime) { - setLastTimeNano(nanoTime); + long cycleDuration; + long diff; - return 1; - } - else - { - long cycleDuration = (long) cycleDurationMillis * 1000000L; - long diff = nanoTime - getLastTimeNano(); + if (client.getUnlockedFpsTarget() > 0L) + { + cycleDuration = nanoTime - tmpNanoTime; + diff = client.getUnlockedFpsTarget() - cycleDuration; + diff /= 1000000L; + if (diff > 0L) + { + try + { + if (diff % 10L == 0L) + { + Thread.sleep(diff - 1L); + Thread.sleep(1L); + } + else + { + Thread.sleep(diff); + } + } + catch (InterruptedException var22) + { + } + + nanoTime = System.nanoTime(); + } + } + + tmpNanoTime = nanoTime; + + cycleDuration = (long) cycleDurationMillis * 1000000L; + diff = nanoTime - getLastTimeNano(); int cycles = (int) (diff / cycleDuration); @@ -71,6 +101,12 @@ public abstract class RSNanoClockMixin implements RSNanoClock return cycles; } + else + { + setLastTimeNano(tmpNanoTime = nanoTime); + + return 1; + } } } } 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 04643a9768..1cab3dd535 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 @@ -1477,6 +1477,8 @@ public interface RSClient extends RSGameEngine, Client boolean isUnlockedFps(); + long getUnlockedFpsTarget(); + void posToCameraAngle(int var0, int var1); @Import("objectSounds")