diff --git a/src/Client/ConfigWindow.java b/src/Client/ConfigWindow.java
index f14aab37..879a37b0 100644
--- a/src/Client/ConfigWindow.java
+++ b/src/Client/ConfigWindow.java
@@ -283,6 +283,7 @@ public class ConfigWindow {
private JSpinner generalPanelLimitFPSSpinner;
private JSpinner generalPanelLimitRanFPSSpinner;
private JCheckBox generalPanelAutoScreenshotCheckbox;
+ private JCheckBox generalPanelPerCharScreenshotCheckbox;
private JTextField generalPanelScreenshotsDirTextField;
private JCheckBox generalPanelRS2HDSkyCheckbox;
private JCheckBox generalPanelCustomSkyboxOverworldCheckbox;
@@ -1799,6 +1800,14 @@ public void stateChanged(ChangeEvent e) {
generalPanelAutoScreenshotCheckbox.setToolTipText(
"Takes a screenshot for you for level ups and on quest completion");
+ generalPanelPerCharScreenshotCheckbox =
+ addCheckbox(
+ "Organize screenshots into separate subfolders for each character", generalPanel);
+ generalPanelPerCharScreenshotCheckbox.setToolTipText(
+ "Automatically creates separate screenshot subfolders for every unique character name");
+ SearchUtils.addSearchMetadata(
+ generalPanelPerCharScreenshotCheckbox, CommonMetadata.DIR.getText());
+
/// Screenshots directory
float screenshotsButtonAlignment = isUsingFlatLAFTheme() ? 0.75f : 0.8f;
@@ -6275,6 +6284,8 @@ private void executeSynchronizeGuiValues() {
generalPanelLimitFPSSpinner.setValue(Settings.FPS_LIMIT.get(Settings.currentProfile));
generalPanelAutoScreenshotCheckbox.setSelected(
Settings.AUTO_SCREENSHOT.get(Settings.currentProfile));
+ generalPanelPerCharScreenshotCheckbox.setSelected(
+ Settings.PER_CHAR_SCREENSHOTS.get(Settings.currentProfile));
generalPanelScreenshotsDirTextField.setText(Settings.SCREENSHOTS_STORAGE_PATH.get("custom"));
generalPanelRS2HDSkyCheckbox.setSelected(Settings.RS2HD_SKY.get(Settings.currentProfile));
generalPanelCustomSkyboxOverworldCheckbox.setSelected(
@@ -6815,6 +6826,8 @@ private void saveSettings() {
Settings.currentProfile, generalPanelTrackpadRotationSlider.getValue());
Settings.AUTO_SCREENSHOT.put(
Settings.currentProfile, generalPanelAutoScreenshotCheckbox.isSelected());
+ Settings.PER_CHAR_SCREENSHOTS.put(
+ Settings.currentProfile, generalPanelPerCharScreenshotCheckbox.isSelected());
Settings.SCREENSHOTS_STORAGE_PATH.put(
Settings.currentProfile,
Settings.validateCustomDir(
@@ -7722,33 +7735,48 @@ public void updateRSCPlusDescription() {
}
public void updateAuthorTabAboutText() {
- StringBuilder authorText = new StringBuilder(String.format("
",osScaleMul(10), osScaleMul(15)));
- authorText.append("RSCPlus is a RuneLite-like client ")
- .append("based on the 234 RSC client.
Learn more at https://rsc.plus.
")
- .append("Thanks to the authors who made this software possible:
");
+ StringBuilder authorText =
+ new StringBuilder(
+ String.format(
+ "",
+ osScaleMul(10), osScaleMul(15)));
+ authorText
+ .append("RSCPlus is a RuneLite-like client ")
+ .append("based on the 234 RSC client.
Learn more at https://rsc.plus.
")
+ .append("Thanks to the authors who made this software possible:
");
if (Launcher.binaryPrefix.equals("Open")) {
- authorText.append("- ● conker, for creating the OpenRSC+ client and native binaries
")
- .append("- ● Ornox, for creating the RSC+ base client & most of its features
");
+ authorText
+ .append("- ● conker, for creating the OpenRSC+ client and native binaries
")
+ .append(
+ "- ● Ornox, for creating the RSC+ base client & most of its features
");
} else {
- authorText.append("- ● Ornox, for creating the RSC+ client & most of its features
");
+ authorText.append(
+ "- ● Ornox, for creating the RSC+ client & most of its features
");
}
- authorText.append("- ● Logg, currently maintains the RSC+ project, new interfaces & improvements
");
+ authorText.append(
+ "- ● Logg, currently maintains the RSC+ project, new interfaces & improvements
");
if (Launcher.binaryPrefix.equals("Open")) {
- authorText.append("- ● conker again, client scaling, fonts, general UX, & many other improvements
");
+ authorText.append(
+ "- ● conker again, client scaling, fonts, general UX, & many other improvements
");
} else if (Launcher.binaryPrefix.isEmpty()) {
- authorText.append("- ● conker, binaries, client scaling, fonts, general UX, & many other improvements
");
+ authorText.append(
+ "- ● conker, binaries, client scaling, fonts, general UX, & many other improvements
");
} else {
- authorText.append("- ● conker, server extensions, client scaling, fonts, general UX, & many other improvements
");
- }
- authorText.append("- ● Brian, who laid a lot of the groundwork for the user interface
")
- .append("- ● Luis, who found a lot of important hooks & fixed a lot of bugs
")
- .append("- ● Talkarcabbage, generic notifications, UI backend, & keybind overhaul
")
- .append("- ● nickzuber, fixed some bugs, highlight/block items
")
- .append("- ● Ryan, keybind to reset camera zoom, toggle statuses in corner always
")
- .append("- ● Yumeko, fixed Twitch chat integration in 2023
")
- .append("- ● sammy123k, added an option to center the XP progress bar
")
- .append("- ● The Jagex team of 2000 to 2004
")
- .append("
");
+ authorText.append(
+ "- ● conker, server extensions, client scaling, fonts, general UX, & many other improvements
");
+ }
+ authorText
+ .append("- ● Brian, who laid a lot of the groundwork for the user interface
")
+ .append("- ● Luis, who found a lot of important hooks & fixed a lot of bugs
")
+ .append(
+ "- ● Talkarcabbage, generic notifications, UI backend, & keybind overhaul
")
+ .append("- ● nickzuber, fixed some bugs, highlight/block items
")
+ .append(
+ "- ● Ryan, keybind to reset camera zoom, toggle statuses in corner always
")
+ .append("- ● Yumeko, fixed Twitch chat integration in 2023
")
+ .append("- ● sammy123k, added an option to center the XP progress bar
")
+ .append("- ● The Jagex team of 2000 to 2004
")
+ .append("
");
reindexSearch(() -> aboutText.setText(authorText.toString()));
frame.revalidate();
diff --git a/src/Client/Extensions/README.md b/src/Client/Extensions/README.md
index 26f06f79..3a7193b9 100644
--- a/src/Client/Extensions/README.md
+++ b/src/Client/Extensions/README.md
@@ -139,7 +139,7 @@ be downloaded to the user's device. Certain misconfigurations, such as the dupli
situations where RSC+ may mishandle world files. Others, such as an incorrectly-specified `server_extension`, will
outright prevent the user from attempting to submit their credentials to the server endpoint. Furthermore, it is
recommended that all JSON endpoints are hosted at the same domain, as partial download failures may block client
-connections under certain conditions or otherwise break certain non-critical extension-related functionalityies.
+connections under certain conditions or otherwise break certain non-critical extension-related functionalities.
Note that functionality exists to handle situations wherein a server's host domain _MUST_ change in response to an
emergency such as a domain hijacking. See the documentation for the `addFormerHostUrl` method within the
diff --git a/src/Client/Settings.java b/src/Client/Settings.java
index f5bbdd0c..3db7d39a 100644
--- a/src/Client/Settings.java
+++ b/src/Client/Settings.java
@@ -152,6 +152,7 @@ public class Settings {
new HashMap();
public static HashMap RAN_EFFECT_TARGET_FPS = new HashMap();
public static HashMap AUTO_SCREENSHOT = new HashMap();
+ public static HashMap PER_CHAR_SCREENSHOTS = new HashMap();
public static HashMap SCREENSHOTS_STORAGE_PATH = new HashMap();
public static HashMap RS2HD_SKY = new HashMap();
public static HashMap CUSTOM_SKYBOX_OVERWORLD_ENABLED =
@@ -973,6 +974,8 @@ public static void definePresets(Properties props) {
AUTO_SCREENSHOT.put(
"custom", getPropBoolean(props, "auto_screenshot", AUTO_SCREENSHOT.get("default")));
+ defineStaticPreset(PER_CHAR_SCREENSHOTS, getPropBoolean(props, "per_char_screenshots", true));
+
defineStaticPreset(
SCREENSHOTS_STORAGE_PATH,
getPropString(props, "screenshots_storage_path", sanitizeDirTextValue(Dir.SCREENSHOT)));
@@ -2811,8 +2814,7 @@ public static void initDir() {
JOptionPane.INFORMATION_MESSAGE,
null,
options,
- null
- );
+ null);
if (response == JOptionPane.YES_OPTION) {
String portableModeAcceptMessage =
@@ -3753,6 +3755,7 @@ public static synchronized void save(String preset) {
props.setProperty(
"ran_effect_target_fps", Integer.toString(RAN_EFFECT_TARGET_FPS.get(preset)));
props.setProperty("auto_screenshot", Boolean.toString(AUTO_SCREENSHOT.get(preset)));
+ props.setProperty("per_char_screenshots", Boolean.toString(PER_CHAR_SCREENSHOTS.get(preset)));
props.setProperty("screenshots_storage_path", SCREENSHOTS_STORAGE_PATH.get(preset));
props.setProperty("rs2hd_sky", Boolean.toString(RS2HD_SKY.get(preset)));
props.setProperty(
diff --git a/src/Game/Renderer.java b/src/Game/Renderer.java
index b37fe475..72d8d679 100644
--- a/src/Game/Renderer.java
+++ b/src/Game/Renderer.java
@@ -2408,8 +2408,9 @@ public static void present(Image image) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
String fbase = Settings.SCREENSHOTS_STORAGE_PATH.get("custom");
- // Use a subdirectory when the player is logged in
- if (!Client.player_name.isEmpty()
+ // Use a subdirectory when the player is logged in and has enabled the convenient option
+ if (Settings.PER_CHAR_SCREENSHOTS.get(Settings.currentProfile)
+ && !Client.player_name.isEmpty()
&& !Client.username_login.equals(Replay.excludeUsername)) {
fbase += Util.formatPlayerName(Client.player_name);
}