From aeea3c9d4784693b1ce1ea1590e4e88d0f0fa062 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 24 Mar 2022 17:04:21 -0600 Subject: [PATCH] rl-client: show FatalErrorDialog when the client crashes --- .../net/runelite/client/rs/ClientLoader.java | 2 +- .../net/runelite/client/rs/RSAppletStub.java | 96 ++++++++++++++++++- .../runelite/client/ui/FatalErrorDialog.java | 10 +- 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index 91781fabba..defdc0637f 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -575,7 +575,7 @@ public class ClientLoader implements Supplier Class clientClass = classLoader.loadClass(initialClass); Applet rs = (Applet) clientClass.newInstance(); - rs.setStub(new RSAppletStub(config)); + rs.setStub(new RSAppletStub(config, runtimeConfigLoader)); if (rs instanceof Client) { diff --git a/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java b/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java index a3a2a0f14a..36024b489f 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java @@ -25,16 +25,28 @@ */ package net.runelite.client.rs; +import java.applet.Applet; import java.applet.AppletContext; import java.applet.AppletStub; +import java.applet.AudioClip; +import java.awt.Image; +import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.util.Enumeration; +import java.util.Iterator; +import javax.swing.SwingUtilities; import lombok.RequiredArgsConstructor; +import net.runelite.client.RuntimeConfig; +import net.runelite.client.RuntimeConfigLoader; +import net.runelite.client.ui.FatalErrorDialog; @RequiredArgsConstructor class RSAppletStub implements AppletStub { private final RSConfig config; + private final RuntimeConfigLoader runtimeConfigLoader; @Override public boolean isActive() @@ -70,7 +82,89 @@ class RSAppletStub implements AppletStub @Override public AppletContext getAppletContext() { - return null; + return new AppletContext() + { + @Override + public AudioClip getAudioClip(URL url) + { + return null; + } + + @Override + public Image getImage(URL url) + { + return null; + } + + @Override + public Applet getApplet(String name) + { + return null; + } + + @Override + public Enumeration getApplets() + { + return null; + } + + @Override + public void showDocument(URL url) + { + if (url.getPath().startsWith("/error_game_")) + { + try + { + RuntimeConfig rtc = runtimeConfigLoader.get(); + if (rtc.showOutageMessage()) + { + return; + } + } + catch (Exception e) + { + } + + String code = url.getPath() + .replace("/", "") + .replace(".ws", ""); + + SwingUtilities.invokeLater(() -> + new FatalErrorDialog("OldSchool RuneScape has crashed with the message: " + code + "") + .setTitle("RuneLite", "OldSchool RuneScape has crashed") + .addHelpButtons() + .open()); + } + } + + @Override + public void showDocument(URL url, String target) + { + showDocument(url); + } + + @Override + public void showStatus(String status) + { + } + + @Override + public void setStream(String key, InputStream stream) throws IOException + { + } + + @Override + public InputStream getStream(String key) + { + return null; + } + + @Override + public Iterator getStreamKeys() + { + return null; + } + }; } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java index aadea93aec..3ad4373a9a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java @@ -61,6 +61,7 @@ public class FatalErrorDialog extends JDialog private final JPanel rightColumn = new JPanel(); private final Font font = new Font(Font.DIALOG, Font.PLAIN, 12); + private final JLabel title; public FatalErrorDialog(String message) { @@ -114,7 +115,7 @@ public class FatalErrorDialog extends JDialog leftPane.setBackground(ColorScheme.DARKER_GRAY_COLOR); leftPane.setLayout(new BorderLayout()); - JLabel title = new JLabel("There was a fatal error starting RuneLite"); + title = new JLabel("There was a fatal error starting RuneLite"); title.setForeground(Color.WHITE); title.setFont(font.deriveFont(16.f)); title.setBorder(new EmptyBorder(10, 10, 10, 10)); @@ -186,6 +187,13 @@ public class FatalErrorDialog extends JDialog return this; } + public FatalErrorDialog setTitle(String windowTitle, String header) + { + super.setTitle(windowTitle); + title.setText(header); + return this; + } + public FatalErrorDialog addHelpButtons() { return addButton("Open logs folder", () -> LinkBrowser.open(RuneLite.LOGS_DIR.toString()))