From d6579901c62fc24e522733665b1a3c8fdecb3623 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 25 Sep 2021 03:01:43 +0200 Subject: [PATCH] api(mixins): More object methods exposed --- .../src/main/java/net/runelite/api/Node.java | 5 ++ .../src/main/java/net/runelite/api/Scene.java | 50 ++++++++++++++++ .../net/runelite/mixins/RSSceneMixin.java | 60 +++++++++++++++++++ .../java/net/runelite/rs/api/RSScene.java | 21 +++++++ runescape-client/src/main/java/Scene.java | 9 ++- .../src/main/java/ScriptFrame.java | 6 +- 6 files changed, 145 insertions(+), 6 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Node.java b/runelite-api/src/main/java/net/runelite/api/Node.java index 56d2755e74..bd1cf8c7cb 100644 --- a/runelite-api/src/main/java/net/runelite/api/Node.java +++ b/runelite-api/src/main/java/net/runelite/api/Node.java @@ -43,6 +43,11 @@ public interface Node */ Node getPrevious(); + /** + * Unlink. + */ + void unlink(); + /** * Gets the hash value of the node. * 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 b7f5103c4c..e40fedf690 100644 --- a/runelite-api/src/main/java/net/runelite/api/Scene.java +++ b/runelite-api/src/main/java/net/runelite/api/Scene.java @@ -71,6 +71,56 @@ public interface Scene */ void removeGameObject(GameObject gameObject); + /** + * Remove a game object from the scene + * @param plane + * @param x + * @param y + */ + void removeGameObject(int plane, int x, int y); + + /** + * Remove a game object from the scene + * @param wallObject + */ + void removeWallObject(WallObject wallObject); + + /** + * Remove a wall object from the scene + * @param plane + * @param x + * @param y + */ + void removeWallObject(int plane, int x, int y); + + /** + * Remove a decorative object from the scene + * @param decorativeObject + */ + void removeDecorativeObject(DecorativeObject decorativeObject); + + /** + * Remove a decorative object from the scene + * @param plane + * @param x + * @param y + */ + void removeDecorativeObject(int plane, int x, int y); + + /** + * Remove a ground object from the scene + * @param groundObject + */ + void removeGroundObject(GroundObject groundObject); + + /** + * Remove a ground object from the scene + * @param plane + * @param x + * @param y + */ + void removeGroundObject(int plane, int x, int y); + void generateHouses(); void setRoofRemovalMode(int flags); 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 303bda7f90..6273fe8f56 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -30,10 +30,13 @@ 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.DecorativeObject; +import net.runelite.api.GroundObject; import net.runelite.api.Perspective; import net.runelite.api.SceneTileModel; import net.runelite.api.SceneTilePaint; import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.hooks.DrawCallbacks; @@ -1240,4 +1243,61 @@ public abstract class RSSceneMixin implements RSScene { rl$tileShapes = tileShapes; } + + @Inject + @Override + public void removeWallObject(WallObject wallObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getWallObject() == wallObject) + { + tile.setWallObject(null); + } + } + } + } + + @Inject + @Override + public void removeDecorativeObject(DecorativeObject decorativeObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getDecorativeObject() == decorativeObject) + { + tile.setDecorativeObject(null); + } + } + } + } + + @Inject + @Override + public void removeGroundObject(GroundObject groundObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getGroundObject() == groundObject) + { + tile.setGroundObject(null); + } + } + } + } } \ No newline at end of file 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 e4dda41f0d..af1f331fe9 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 @@ -1,8 +1,11 @@ package net.runelite.rs.api; +import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; import net.runelite.api.Scene; import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.mapping.Import; public interface RSScene extends Scene @@ -56,6 +59,24 @@ public interface RSScene extends Scene @Import("removeGameObject") void removeGameObject(GameObject gameObject); + @Import("removeGameObject") + void removeGameObject(int plane, int x, int y); + + void removeWallObject(WallObject wallObject); + + @Import("removeBoundaryObject") + void removeWallObject(int plane, int x, int y); + + void removeDecorativeObject(DecorativeObject decorativeObject); + + @Import("removeWallDecoration") + void removeDecorativeObject(int plane, int x, int y); + + void removeGroundObject(GroundObject groundObject); + + @Import("removeFloorDecoration") + void removeGroundObject(int plane, int x, int y); + byte[][][] getUnderlayIds(); void setUnderlayIds(byte[][][] underlayIds); diff --git a/runescape-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java index 45f73f98fc..aeb44a5f45 100644 --- a/runescape-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -721,7 +721,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhn;" ) - public BoundaryObject method4155(int var1, int var2, int var3) { + @Export("getBoundaryObject") + public BoundaryObject getBoundaryObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.boundaryObject; } @@ -730,7 +731,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhh;" ) - public WallDecoration method4156(int var1, int var2, int var3) { + @Export("getWallDecoration") + public WallDecoration getWallDecoration(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.wallDecoration; } @@ -739,7 +741,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhj;" ) - public GameObject method4180(int var1, int var2, int var3) { + @Export("getGameObject") + public GameObject getGameObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if (var4 == null) { return null; diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 725d92f661..71feaa1b70 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -412,7 +412,7 @@ public class ScriptFrame { var9 = Client.field549[var7]; if (var3 >= 0 && var4 >= 0 && var3 < 103 && var4 < 103) { if (var9 == 0) { - BoundaryObject var33 = CollisionMap.scene.method4155(class391.Client_plane, var3, var4); + BoundaryObject var33 = CollisionMap.scene.getBoundaryObject(class391.Client_plane, var3, var4); if (var33 != null) { var11 = HealthBarDefinition.Entity_unpackID(var33.tag); if (var7 == 2) { @@ -425,7 +425,7 @@ public class ScriptFrame { } if (var9 == 1) { - WallDecoration var43 = CollisionMap.scene.method4156(class391.Client_plane, var3, var4); + WallDecoration var43 = CollisionMap.scene.getWallDecoration(class391.Client_plane, var3, var4); if (var43 != null) { var11 = HealthBarDefinition.Entity_unpackID(var43.tag); if (var7 != 4 && var7 != 5) { @@ -444,7 +444,7 @@ public class ScriptFrame { } if (var9 == 2) { - GameObject var44 = CollisionMap.scene.method4180(class391.Client_plane, var3, var4); + GameObject var44 = CollisionMap.scene.getGameObject(class391.Client_plane, var3, var4); if (var7 == 11) { var7 = 10; }