diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java index c7b99a2cf4..be0267f078 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java @@ -29,7 +29,11 @@ import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import javax.inject.Inject; import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Player; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -66,9 +70,18 @@ public class EntityHiderPlugin extends Plugin updateConfig(); } + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOGGED_IN) + { + client.setIsHidingEntities(isPlayerRegionAllowed()); + } + } + private void updateConfig() { - client.setIsHidingEntities(true); + client.setIsHidingEntities(isPlayerRegionAllowed()); client.setPlayersHidden(config.hidePlayers()); client.setPlayersHidden2D(config.hidePlayers2D()); @@ -108,4 +121,19 @@ public class EntityHiderPlugin extends Plugin client.setProjectilesHidden(false); } + + private boolean isPlayerRegionAllowed() + { + final Player localPlayer = client.getLocalPlayer(); + + if (localPlayer == null) + { + return true; + } + + final int playerRegionID = WorldPoint.fromLocalInstance(client, localPlayer.getLocalLocation()).getRegionID(); + + // 9520 = Castle Wars + return playerRegionID != 9520; + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java index 59c3900c7a..7c89d3ee0d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java @@ -77,12 +77,25 @@ public abstract class EntityHiderMixin implements RSScene private static boolean hideProjectiles; @Copy("addEntityMarker") - abstract boolean addEntityMarker(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RSRenderable renderable, int var10, boolean var11, long var12, int var13); + abstract boolean addEntityMarker(int var1, int var2, int var3, int var4, int var5, int x, int y, int var8, RSRenderable renderable, int var10, boolean var11, long var12, int var13); @Replace("addEntityMarker") - boolean rl$addEntityMarker(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RSRenderable renderable, int var10, boolean var11, long var12, int var13) + boolean rl$addEntityMarker(int var1, int var2, int var3, int var4, int var5, int x, int y, int var8, RSRenderable renderable, int var10, boolean var11, long var12, int var13) { - return shouldDraw(renderable, false) && addEntityMarker(var1, var2, var3, var4, var5, var6, var7, var8, renderable, var10, var11, var12, var13); + final boolean shouldDraw = shouldDraw(renderable, false); + + if (!shouldDraw) + { + final int tileX = x >> 7; + final int tileY = y >> 7; + /* + * Set the 'occupied' tick to -1, to reset the tile being 'occupied', + * making the game think an entity hasn't been rendered at the location yet. + */ + client.getOccupiedTilesTick()[tileX][tileY] = -1; + } + + return shouldDraw && addEntityMarker(var1, var2, var3, var4, var5, x, y, var8, renderable, var10, var11, var12, var13); } @Copy("draw2DExtras") 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 4cf4574d78..d3518c5c99 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 @@ -691,4 +691,7 @@ public interface RSClient extends RSGameEngine, Client @Import("menuAction") @Protect void menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7); + + @Import("occupiedTilesTick") + int[][] getOccupiedTilesTick(); }