project: Mixins

This commit is contained in:
Owain van Brakel
2021-10-29 04:20:12 +02:00
parent 0aedd915d4
commit c3de306086
6 changed files with 209 additions and 7 deletions

View File

@@ -33,8 +33,9 @@ import net.runelite.rs.api.RSClient;
@Mixin(RSClient.class)
public abstract class CameraMixin implements RSClient
{
private static final int STANDARD_PITCH_MAX = 383;
private static final int NEW_PITCH_MAX = 512;
public static final int STANDARD_PITCH_MIN = 128;
public static final int STANDARD_PITCH_MAX = 383;
public static final int NEW_PITCH_MAX = 512;
@Shadow("client")
static RSClient client;
@@ -48,6 +49,13 @@ public abstract class CameraMixin implements RSClient
@Inject
static int lastPitchTarget = 128;
@Inject
@Override
public boolean getCameraPitchRelaxerEnabled()
{
return pitchRelaxEnabled;
}
@Inject
public void setCameraPitchRelaxerEnabled(boolean enabled)
{

View File

@@ -27,6 +27,7 @@ package net.runelite.mixins;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.primitives.Doubles;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
@@ -71,6 +72,7 @@ import net.runelite.api.NameableContainer;
import net.runelite.api.Node;
import net.runelite.api.NodeCache;
import net.runelite.api.ObjectComposition;
import net.runelite.api.Perspective;
import static net.runelite.api.Perspective.LOCAL_TILE_SIZE;
import net.runelite.api.Player;
import net.runelite.api.Point;
@@ -134,6 +136,9 @@ import net.runelite.api.widgets.WidgetConfig;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.api.widgets.WidgetItem;
import net.runelite.api.widgets.WidgetType;
import static net.runelite.mixins.CameraMixin.NEW_PITCH_MAX;
import static net.runelite.mixins.CameraMixin.STANDARD_PITCH_MAX;
import static net.runelite.mixins.CameraMixin.STANDARD_PITCH_MIN;
import net.runelite.rs.api.RSAbstractArchive;
import net.runelite.rs.api.RSArchive;
import net.runelite.rs.api.RSChatChannel;
@@ -262,6 +267,21 @@ public abstract class RSClientMixin implements RSClient
@Inject
private Integer comparingAppearance = 0;
@Inject
private static boolean hdMinimapEnabled;
@Inject
public static boolean unlockedFps;
@Inject
public static double tmpCamAngleY;
@Inject
public static double tmpCamAngleX;
@Inject
public long lastNanoTime;
@Inject
private List<String> outdatedScripts = new ArrayList<>();
@@ -332,9 +352,6 @@ public abstract class RSClientMixin implements RSClient
{
}
@Inject
private static boolean hdMinimapEnabled;
@Inject
@Override
public String getBuildID()
@@ -1581,6 +1598,7 @@ public abstract class RSClientMixin implements RSClient
public void draw(boolean var1)
{
callbacks.clientMainLoop();
updateCamera();
}
@MethodHook("drawInterface")
@@ -2356,7 +2374,6 @@ public abstract class RSClientMixin implements RSClient
}
@Inject
public static RSArchive[] archives = new RSArchive[21];
@@ -2407,5 +2424,79 @@ public abstract class RSClientMixin implements RSClient
{
return client.getSequenceDefinition(id);
}
@Inject
@Override
public boolean isUnlockedFps()
{
return unlockedFps;
}
@Inject
public void setUnlockedFps(boolean unlocked)
{
unlockedFps = unlocked;
if (unlocked)
{
posToCameraAngle(client.getMapAngle(), client.getCameraPitch());
}
}
@Inject
public void updateCamera()
{
if (unlockedFps)
{
long nanoTime = System.nanoTime();
long diff = nanoTime - this.lastNanoTime;
this.lastNanoTime = nanoTime;
if (this.getGameState() == GameState.LOGGED_IN)
{
this.interpolateCamera(diff);
}
}
}
@Inject
public void interpolateCamera(long var1)
{
double angleDX = diffToDangle(client.getCamAngleDY(), var1);
double angleDY = diffToDangle(client.getCamAngleDX(), var1);
tmpCamAngleY += angleDX / 2;
tmpCamAngleX += angleDY / 2;
tmpCamAngleX = Doubles.constrainToRange(tmpCamAngleX, Perspective.UNIT * STANDARD_PITCH_MIN, client.getCameraPitchRelaxerEnabled() ? Perspective.UNIT * NEW_PITCH_MAX : Perspective.UNIT * STANDARD_PITCH_MAX);
int yaw = toCameraPos(tmpCamAngleY);
int pitch = toCameraPos(tmpCamAngleX);
client.setCameraYawTarget(yaw);
client.setCameraPitchTarget(pitch);
}
@Inject
public static double diffToDangle(int var0, long var1)
{
double var2 = var0 * Perspective.UNIT;
double var3 = (double) var1 / 2.0E7D;
return var2 * var3;
}
@Inject
@Override
public void posToCameraAngle(int var0, int var1)
{
tmpCamAngleY = var0 * Perspective.UNIT;
tmpCamAngleX = var1 * Perspective.UNIT;
}
@Inject
public static int toCameraPos(double var0)
{
return (int) (var0 / Perspective.UNIT) & 2047;
}
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (c) 2016-2017, Adam <Adam@sigterm.info>
* 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.mixins;
import net.runelite.api.mixins.Copy;
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.RSNanoClock;
@Mixin(RSNanoClock.class)
public abstract class RSNanoClockMixin implements RSNanoClock
{
@Shadow("client")
private static RSClient client;
@Copy("wait")
@Replace("wait")
public int copy$wait(int cycleDurationMillis, int var2)
{
if (!client.isUnlockedFps())
{
return copy$wait(cycleDurationMillis, var2);
}
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);
if (cycles > 10)
{
cycles = 10;
}
return cycles;
}
}
}
}

View File

@@ -36,6 +36,7 @@ import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.api.widgets.JavaScriptCallback;
import static net.runelite.cache.script.Opcodes.CAM_FORCEANGLE;
import static net.runelite.cache.script.Opcodes.INVOKE;
import static net.runelite.cache.script.Opcodes.RETURN;
import static net.runelite.cache.script.RuneLiteOpcodes.RUNELITE_EXECUTE;
@@ -134,6 +135,17 @@ public abstract class ScriptVMMixin implements RSClient
return false;
case RETURN:
client.getCallbacks().post(new ScriptPostFired((int) currentScript.getHash()));
return false;
case CAM_FORCEANGLE:
int[] intStack = client.getIntStack();
int intStackSize = client.getIntStackSize();
int var4 = intStack[intStackSize - 1];
int var3 = intStack[intStackSize - 2];
if (!client.isCameraLocked())
{
client.posToCameraAngle(var4, var3);
}
return false;
}
return false;