diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 1ac8b91494..36f5a2efa4 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -2035,4 +2035,9 @@ public interface Client extends GameShell * Sets whether the flames on the login screen should be rendered */ void setShouldRenderLoginScreenFire(boolean val); + + /** + * Gets whether the flames on the login screen should be rendered + */ + boolean shouldRenderLoginScreenFire(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/LoginScreenMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/LoginScreenMixin.java new file mode 100644 index 0000000000..a20b7ccde5 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/LoginScreenMixin.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020, Owain van Brakel + * 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.GameState; +import net.runelite.api.Sprite; +import net.runelite.api.mixins.FieldHook; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; + +@Mixin(RSClient.class) +public abstract class LoginScreenMixin implements RSClient +{ + @Shadow("client") + private static RSClient client; + + @Inject + private static boolean shouldRenderLoginScreenFire = true; + + @Inject + private static Sprite loginScreenBackground; + + @Inject + public void setShouldRenderLoginScreenFire(boolean shouldRender) + { + shouldRenderLoginScreenFire = shouldRender; + } + + @Inject + public boolean shouldRenderLoginScreenFire() + { + return shouldRenderLoginScreenFire; + } + + @Inject + public void setLoginScreen(Sprite background) + { + assert client.isClientThread() : "setLoginScreen must be called on client thread"; + + loginScreenBackground = background; + client.clearLoginScreen(false); + if (client.getGameState() == GameState.LOGIN_SCREEN) + { + try + { + client.setGameState(GameState.UNKNOWN); + } + finally + { + client.setGameState(GameState.LOGIN_SCREEN); + } + } + } + + @Inject + @FieldHook("leftTitleSprite") + static void setLeftTitleSprite(int idx) + { + Sprite loginscreen = loginScreenBackground; + + if (loginscreen != null) + { + client.setLeftTitleSprite(loginscreen); + } + } + + @Inject + @FieldHook("rightTitleSprite") + static void setRightTitleSprite(int idx) + { + Sprite loginscreen = loginScreenBackground; + + if (loginscreen != null && loginscreen.getWidth() > 383) + { + client.setRightTitleSprite(client.createSprite(new int[]{0}, 1, 1)); + } + } +} 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 ccd30e166c..2c22f53273 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -53,12 +53,14 @@ import net.runelite.api.InventoryID; import net.runelite.api.ItemDefinition; import net.runelite.api.MenuEntry; import net.runelite.api.MenuOpcode; +import static net.runelite.api.MenuOpcode.*; import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; import net.runelite.api.NameableContainer; import net.runelite.api.Node; import net.runelite.api.ObjectDefinition; +import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.Prayer; @@ -127,8 +129,6 @@ import net.runelite.rs.api.RSTileItem; import net.runelite.rs.api.RSUsername; import net.runelite.rs.api.RSWidget; import org.slf4j.Logger; -import static net.runelite.api.MenuOpcode.*; -import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; @Mixin(RSClient.class) public abstract class RSClientMixin implements RSClient @@ -1865,14 +1865,14 @@ public abstract class RSClientMixin implements RSClient public boolean isMirrored() { return isMirrored; - }; + } @Inject @Override public void setMirrored(boolean isMirrored) { this.isMirrored = isMirrored; - }; + } @Inject @Override diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSLoginScreenAnimationMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSLoginScreenAnimationMixin.java new file mode 100644 index 0000000000..9cbce63056 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSLoginScreenAnimationMixin.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020, Owain van Brakel + * 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.RSLoginScreenAnimation; + +@Mixin(RSLoginScreenAnimation.class) +public abstract class RSLoginScreenAnimationMixin implements RSLoginScreenAnimation +{ + @Shadow("client") + private static RSClient client; + + @Copy("draw") + void rs$draw(int var1, int var2) + { + throw new RuntimeException(); + } + + @Replace("draw") + void rl$draw(int var1, int var2) + { + if (client.shouldRenderLoginScreenFire()) + { + rs$draw(var1, var2); + } + } +} 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 cd705aba67..9381f7a87a 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 @@ -1260,4 +1260,13 @@ public interface RSClient extends RSGameShell, Client @Import("stopTimeMs") void setStopTimeMs(long time); + + @Import("clearLoginScreen") + void clearLoginScreen(boolean shouldClear); + + @Import("leftTitleSprite") + void setLeftTitleSprite(Sprite background); + + @Import("rightTitleSprite") + void setRightTitleSprite(Sprite background); } diff --git a/runescape-client/src/main/java/Calendar.java b/runescape-client/src/main/java/Calendar.java index 293b50e0c2..c7a88057a4 100644 --- a/runescape-client/src/main/java/Calendar.java +++ b/runescape-client/src/main/java/Calendar.java @@ -46,7 +46,7 @@ public class Calendar { garbageValue = "-1281352540" ) static void method4032() { - if (Login.field1205) { + if (Login.clearLoginScreen) { ModelData0.titleboxSprite = null; GrandExchangeOfferOwnWorldComparator.titlebuttonSprite = null; Login.runesSprite = null; @@ -86,7 +86,7 @@ public class Calendar { } } - Login.field1205 = false; + Login.clearLoginScreen = false; } } } diff --git a/runescape-client/src/main/java/Login.java b/runescape-client/src/main/java/Login.java index 41df5ff65f..71e84b0c9c 100644 --- a/runescape-client/src/main/java/Login.java +++ b/runescape-client/src/main/java/Login.java @@ -9,7 +9,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Login") public class Login { @ObfuscatedName("m") - static boolean field1205; + @Export("clearLoginScreen") + static boolean clearLoginScreen; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -1204959409 diff --git a/runescape-client/src/main/java/class299.java b/runescape-client/src/main/java/class299.java index e704b28387..7e143d3817 100644 --- a/runescape-client/src/main/java/class299.java +++ b/runescape-client/src/main/java/class299.java @@ -102,7 +102,7 @@ public class class299 { garbageValue = "53757689" ) static void method5349(AbstractArchive var0, AbstractArchive var1, boolean var2, int var3) { - if (Login.field1205) { + if (Login.clearLoginScreen) { if (var3 == 4) { Login.loginIndex = 4; } @@ -179,7 +179,7 @@ public class class299 { } } - Login.field1205 = true; + Login.clearLoginScreen = true; Login.xPadding = (WorldMapLabel.canvasWidth - 765) / 2; Login.loginBoxX = Login.xPadding + 202; PacketWriter.loginBoxCenter = Login.loginBoxX + 180;