From 7f56a4f050a6dc23e33d469b001ae24e8b5da18c Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 30 Mar 2022 15:03:06 +0200 Subject: [PATCH] mixins: Fix low detail --- .../net/runelite/mixins/RSClientMixin.java | 64 +++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 9 +++ .../rs/api/RSFloorOverlayDefinition.java | 18 +++++- runescape-client/src/main/java/Canvas.java | 2 +- runescape-client/src/main/java/Tiles.java | 2 +- .../src/main/java/WorldMapIcon_1.java | 3 +- 6 files changed, 94 insertions(+), 4 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 325d74f697..e868fa63f5 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -143,12 +143,15 @@ 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.RSBuffer; import net.runelite.rs.api.RSChatChannel; import net.runelite.rs.api.RSClanChannel; import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSCollisionMap; import net.runelite.rs.api.RSDualNode; import net.runelite.rs.api.RSEnumComposition; import net.runelite.rs.api.RSEvictingDualNodeHashTable; +import net.runelite.rs.api.RSFloorOverlayDefinition; import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSInterfaceParent; @@ -2880,5 +2883,66 @@ public abstract class RSClientMixin implements RSClient return modelData.newModelData(modelData, true, true, true, true); } + + @Inject + public static RSFloorOverlayDefinition loadFloorOverlay(int var0) + { + RSFloorOverlayDefinition var1 = (RSFloorOverlayDefinition) client.getFloorOverlayDefinitionCache().get(var0); + + if (var1 == null) + { + byte[] var2 = client.getFloorOverlayDefinitionArchive().loadData(4, var0); + var1 = client.newFloorOverlayDefinition(); + if (var2 != null) + { + RSBuffer var3 = client.newBuffer(var2); + var1.decode(var3, var0); + } + + var1.postDecode(); + client.getFloorOverlayDefinitionCache().put((RSDualNode) var1, (long) var0); + } + + return var1; + } + + @Copy("addObjects") + @Replace("addObjects") + @SuppressWarnings("InfiniteRecursion") + public static void copy$addObjects(int var0, int var1, int var2, int var3, int var4, int var5, RSScene var6, RSCollisionMap var7) + { + boolean resetLowMemory = false; + + byte tileSetting = client.getTileSettings()[var0][var1][var2]; + + if (client.isLowMemory()) + { + byte[] var10000 = client.getTileSettings()[var0][var1]; + var10000[var2] &= -17; + if (var5 == 22) + { + int TileOverlay = client.getTileOverlays()[var0][var1][var2] & 255; + + if (TileOverlay > 0) + { + RSFloorOverlayDefinition floorOverlayDefinition = loadFloorOverlay(TileOverlay - 1); + if (floorOverlayDefinition.getTexture() < 0 && floorOverlayDefinition.getPrimaryRgb() == 16711935) + { + client.setLowMemory(false); + resetLowMemory = true; + } + } + } + } + + copy$addObjects(var0, var1, var2, var3, var4, var5, var6, var7); + + client.getTileSettings()[var0][var1][var2] = tileSetting; + + if (resetLowMemory) + { + client.setLowMemory(true); + } + } } 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 b4eac54666..bcdba6f4a4 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 @@ -649,6 +649,9 @@ public interface RSClient extends RSGameEngine, Client @Override boolean[] getPressedKeys(); + @Import("isLowDetail") + boolean isLowMemory(); + @Import("isLowDetail") void setLowMemory(boolean lowMemory); @@ -1201,6 +1204,9 @@ public interface RSClient extends RSGameEngine, Client @Import("VarpDefinition_get") RSVarpDefinition getVarpDefinition(int id); + @Construct + RSFloorOverlayDefinition newFloorOverlayDefinition(); + @Construct RSTileItem newTileItem(); @@ -1500,6 +1506,9 @@ public interface RSClient extends RSGameEngine, Client @Import("FloorUnderlayDefinition_cached") RSEvictingDualNodeHashTable getFloorUnderlayDefinitionCache(); + @Import("FloorOverlayDefinition_archive") + RSAbstractArchive getFloorOverlayDefinitionArchive(); + @Import("FloorOverlayDefinition_cached") RSEvictingDualNodeHashTable getFloorOverlayDefinitionCache(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSFloorOverlayDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFloorOverlayDefinition.java index 2197769df0..6bcc420e56 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSFloorOverlayDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFloorOverlayDefinition.java @@ -1,3 +1,19 @@ package net.runelite.rs.api; -public interface RSFloorOverlayDefinition {} +import net.runelite.mapping.Import; + +public interface RSFloorOverlayDefinition +{ + @Import("primaryRgb") + int getPrimaryRgb(); + + @Import("texture") + int getTexture(); + + @Import("decode") + void decode(RSBuffer var1, int var2); + + @Import("postDecode") + void postDecode(); + +} diff --git a/runescape-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java index bf2132fe96..c86bde696a 100644 --- a/runescape-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -106,7 +106,7 @@ public final class Canvas extends java.awt.Canvas { var19 = var4[var18]; } - WorldMapIcon_1.method4556(var12, var16, var17, var6, var15, var14, var3, var19); // L: 313 + WorldMapIcon_1.addObjects(var12, var16, var17, var6, var15, var14, var3, var19); // L: 313 } } } diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index e6d674b9ac..618d6180da 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -130,7 +130,7 @@ public final class Tiles { var25 = var9[var24]; } - WorldMapIcon_1.method4556(var1, var22, var23, var11, var20 + var7 & 3, var19, var8, var25); // L: 347 + WorldMapIcon_1.addObjects(var1, var22, var23, var11, var20 + var7 & 3, var19, var8, var25); // L: 347 } } } diff --git a/runescape-client/src/main/java/WorldMapIcon_1.java b/runescape-client/src/main/java/WorldMapIcon_1.java index 9a52288e39..4cc48b781c 100644 --- a/runescape-client/src/main/java/WorldMapIcon_1.java +++ b/runescape-client/src/main/java/WorldMapIcon_1.java @@ -127,7 +127,8 @@ public class WorldMapIcon_1 extends AbstractWorldMapIcon { descriptor = "(IIIIIILgs;Lgf;I)V", garbageValue = "-1640512620" ) - static final void method4556(int var0, int var1, int var2, int var3, int var4, int var5, Scene var6, CollisionMap var7) { + @Export("addObjects") + static final void addObjects(int var0, int var1, int var2, int var3, int var4, int var5, Scene var6, CollisionMap var7) { if (!Client.isLowDetail || (Tiles.Tiles_renderFlags[0][var1][var2] & 2) != 0 || (Tiles.Tiles_renderFlags[var0][var1][var2] & 16) == 0) { // L: 355 356 357 if (var0 < Tiles.Tiles_minPlane) { // L: 360 Tiles.Tiles_minPlane = var0;