From bf5c9f99822ba4c16eaacc08af507e12a287bcf5 Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:56:28 +0100 Subject: [PATCH] Even more improvements Added SaveFilesCallback to interact with the saving api Require alpha inventory emulation setting to restart / cleaned code. Added VFPListEntry#renderTooltip Added tooltip support to AbstractSetting API --- .../viafabricplus/ViaFabricPlus.java | 10 ++--- .../event/RegisterSettingsCallback.java | 7 ++-- .../event/SaveFilesCallback.java | 42 +++++++++++++++++++ .../impl/ViaFabricPlusVLLoader.java | 8 ++-- .../ViaFabricPlusAlphaInventoryProvider.java | 29 +++---------- .../viafabricplus/save/SaveManager.java | 10 ++++- .../screen/base/VFPListEntry.java | 38 +++++++++++++---- .../settings/BooleanSettingRenderer.java | 5 ++- .../settings/ButtonSettingRenderer.java | 3 ++ .../screen/settings/ModeSettingRenderer.java | 5 ++- .../screen/settings/TitleRenderer.java | 1 + .../VersionedBooleanSettingRenderer.java | 5 ++- .../settings/SettingsManager.java | 4 +- .../settings/base/AbstractSetting.java | 11 +++++ .../settings/impl/GeneralSettings.java | 2 + .../assets/viafabricplus/lang/en_us.json | 1 + 16 files changed, 132 insertions(+), 49 deletions(-) create mode 100644 src/main/java/de/florianmichael/viafabricplus/event/SaveFilesCallback.java diff --git a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java index 05946743..d21d1d80 100644 --- a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java +++ b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java @@ -63,15 +63,13 @@ public class ViaFabricPlus { directory.mkdir(); ClassLoaderPriorityUtil.loadOverridingJars(directory); // Load overriding jars first so other code can access the new classes + settingsManager = new SettingsManager(); + saveManager = new SaveManager(settingsManager); + ClientsideFixes.init(); // Init clientside related fixes loadingFuture = ProtocolHack.init(directory); // Init ViaVersion protocol translator platform - settingsManager = new SettingsManager(); - saveManager = new SaveManager(settingsManager); - PostGameLoadCallback.EVENT.register(() -> { - saveManager.init(); - loadingFuture.join(); - }); // Has to wait for Minecraft because of the translation system usages + PostGameLoadCallback.EVENT.register(() -> loadingFuture.join()); // Block game loading until ViaVersion has loaded } public static ViaFabricPlus global() { diff --git a/src/main/java/de/florianmichael/viafabricplus/event/RegisterSettingsCallback.java b/src/main/java/de/florianmichael/viafabricplus/event/RegisterSettingsCallback.java index 956b1d8d..184db0c5 100644 --- a/src/main/java/de/florianmichael/viafabricplus/event/RegisterSettingsCallback.java +++ b/src/main/java/de/florianmichael/viafabricplus/event/RegisterSettingsCallback.java @@ -19,6 +19,7 @@ package de.florianmichael.viafabricplus.event; +import de.florianmichael.viafabricplus.settings.SettingsManager; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; @@ -27,13 +28,13 @@ import net.fabricmc.fabric.api.event.EventFactory; */ public interface RegisterSettingsCallback { - Event EVENT = EventFactory.createArrayBacked(RegisterSettingsCallback.class, listeners -> state -> { + Event EVENT = EventFactory.createArrayBacked(RegisterSettingsCallback.class, listeners -> (settingsManager, state) -> { for (RegisterSettingsCallback listener : listeners) { - listener.onInitializeSettings(state); + listener.onRegisterSettings(settingsManager, state); } }); - void onInitializeSettings(final State state); + void onRegisterSettings(final SettingsManager settingsManager, final State state); enum State { PRE, POST diff --git a/src/main/java/de/florianmichael/viafabricplus/event/SaveFilesCallback.java b/src/main/java/de/florianmichael/viafabricplus/event/SaveFilesCallback.java new file mode 100644 index 00000000..94b160a0 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/event/SaveFilesCallback.java @@ -0,0 +1,42 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 FlorianMichael/EnZaXD + * Copyright (C) 2023 RK_01/RaphiMC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.florianmichael.viafabricplus.event; + +import de.florianmichael.viafabricplus.save.SaveManager; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +/** + * This event is fired when ViaFabricPlus has loaded its save files, and before it starts reading the values from the save files. + */ +public interface SaveFilesCallback { + + Event EVENT = EventFactory.createArrayBacked(SaveFilesCallback.class, listeners -> (saveManager, state) -> { + for (SaveFilesCallback listener : listeners) { + listener.onLoadSaveFiles(saveManager, state); + } + }); + + void onLoadSaveFiles(final SaveManager saveManager, final State state); + + enum State { + PRE, POST + } +} diff --git a/src/main/java/de/florianmichael/viafabricplus/protocolhack/impl/ViaFabricPlusVLLoader.java b/src/main/java/de/florianmichael/viafabricplus/protocolhack/impl/ViaFabricPlusVLLoader.java index 1a7c6b22..75e94b66 100644 --- a/src/main/java/de/florianmichael/viafabricplus/protocolhack/impl/ViaFabricPlusVLLoader.java +++ b/src/main/java/de/florianmichael/viafabricplus/protocolhack/impl/ViaFabricPlusVLLoader.java @@ -32,11 +32,11 @@ import de.florianmichael.viafabricplus.protocolhack.provider.viabedrock.ViaFabri import de.florianmichael.viafabricplus.protocolhack.provider.viabedrock.ViaFabricPlusTransferProvider; import de.florianmichael.viafabricplus.protocolhack.provider.vialegacy.*; import de.florianmichael.viafabricplus.protocolhack.provider.viaversion.*; +import de.florianmichael.viafabricplus.settings.impl.GeneralSettings; import net.raphimc.viabedrock.protocol.providers.BlobCacheProvider; import net.raphimc.viabedrock.protocol.providers.NettyPipelineProvider; import net.raphimc.viabedrock.protocol.providers.TransferProvider; import net.raphimc.vialegacy.protocols.alpha.protocolb1_0_1_1_1toa1_2_3_5_1_2_6.providers.AlphaInventoryProvider; -import net.raphimc.vialegacy.protocols.alpha.protocolb1_0_1_1_1toa1_2_3_5_1_2_6.providers.TrackingAlphaInventoryProvider; import net.raphimc.vialegacy.protocols.classic.protocola1_0_15toc0_28_30.providers.ClassicMPPassProvider; import net.raphimc.vialegacy.protocols.classic.protocola1_0_15toc0_28_30.providers.ClassicWorldHeightProvider; import net.raphimc.vialegacy.protocols.release.protocol1_3_1_2to1_2_4_5.providers.OldAuthProvider; @@ -65,11 +65,13 @@ public class ViaFabricPlusVLLoader extends VLLoader { providers.use(EncryptionProvider.class, new ViaFabricPlusEncryptionProvider()); providers.use(GameProfileFetcher.class, new ViaFabricPlusGameProfileFetcher()); providers.use(ClassicMPPassProvider.class, new ViaFabricPlusClassicMPPassProvider()); - - providers.use(AlphaInventoryProvider.class, new ViaFabricPlusAlphaInventoryProvider(providers.get(AlphaInventoryProvider.class))); + if (GeneralSettings.global().emulateInventoryActionsInAlphaVersions.getValue()) { + providers.use(AlphaInventoryProvider.class, new ViaFabricPlusAlphaInventoryProvider()); + } providers.use(NettyPipelineProvider.class, new ViaFabricPlusNettyPipelineProvider()); providers.use(BlobCacheProvider.class, new ViaFabricPlusBlobCacheProvider()); providers.use(TransferProvider.class, new ViaFabricPlusTransferProvider()); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/vialegacy/ViaFabricPlusAlphaInventoryProvider.java b/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/vialegacy/ViaFabricPlusAlphaInventoryProvider.java index 5374116a..170cac9c 100644 --- a/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/vialegacy/ViaFabricPlusAlphaInventoryProvider.java +++ b/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/vialegacy/ViaFabricPlusAlphaInventoryProvider.java @@ -34,15 +34,10 @@ import java.util.List; import static net.raphimc.vialegacy.protocols.alpha.protocolb1_0_1_1_1toa1_2_3_5_1_2_6.Protocolb1_0_1_1_1toa1_2_3_5_1_2_6.copyItems; public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider { - private final AlphaInventoryProvider alphaInventoryProvider; - - public ViaFabricPlusAlphaInventoryProvider(final AlphaInventoryProvider alphaInventoryProvider) { - this.alphaInventoryProvider = alphaInventoryProvider; - } @Override public boolean usesInventoryTracker() { - return !GeneralSettings.global().emulateInventoryActionsInAlphaVersions.getValue(); + return false; } protected Item[] getMinecraftContainerItems(final List trackingItems) { @@ -59,9 +54,7 @@ public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider @Override public Item[] getMainInventoryItems(UserConnection user) { - if (usesInventoryTracker()) { - return alphaInventoryProvider.getMainInventoryItems(user); - } else if (getPlayer() == null) { + if (getPlayer() == null) { return new Item[37]; } @@ -70,9 +63,7 @@ public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider @Override public Item[] getCraftingInventoryItems(UserConnection user) { - if (usesInventoryTracker()) { - return alphaInventoryProvider.getCraftingInventoryItems(user); - } else if (getPlayer() == null) { + if (getPlayer() == null) { return new Item[4]; } @@ -81,9 +72,7 @@ public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider @Override public Item[] getArmorInventoryItems(UserConnection user) { - if (usesInventoryTracker()) { - return alphaInventoryProvider.getArmorInventoryItems(user); - } else if (getPlayer() == null) { + if (getPlayer() == null) { return new Item[4]; } @@ -92,9 +81,7 @@ public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider @Override public Item[] getContainerItems(UserConnection user) { - if (usesInventoryTracker()) { - return alphaInventoryProvider.getContainerItems(user); - } else if (getPlayer() == null) { + if (getPlayer() == null) { return new Item[37]; } @@ -103,11 +90,7 @@ public class ViaFabricPlusAlphaInventoryProvider extends AlphaInventoryProvider @Override public void addToInventory(UserConnection user, Item item) { - if (usesInventoryTracker()) { - alphaInventoryProvider.addToInventory(user, item); - } else { - getPlayer().getInventory().insertStack(ItemTranslator.viaB1_8toMc(item)); - } + getPlayer().getInventory().insertStack(ItemTranslator.viaB1_8toMc(item)); } protected ClientPlayerEntity getPlayer() { diff --git a/src/main/java/de/florianmichael/viafabricplus/save/SaveManager.java b/src/main/java/de/florianmichael/viafabricplus/save/SaveManager.java index 0996873e..5d32f52a 100644 --- a/src/main/java/de/florianmichael/viafabricplus/save/SaveManager.java +++ b/src/main/java/de/florianmichael/viafabricplus/save/SaveManager.java @@ -19,6 +19,7 @@ package de.florianmichael.viafabricplus.save; +import de.florianmichael.viafabricplus.event.SaveFilesCallback; import de.florianmichael.viafabricplus.save.impl.AccountsSave; import de.florianmichael.viafabricplus.save.impl.SettingsSave; import de.florianmichael.viafabricplus.settings.SettingsManager; @@ -34,22 +35,27 @@ public class SaveManager { private final AccountsSave accountsSave; public SaveManager(final SettingsManager settingsManager) { + SaveFilesCallback.EVENT.invoker().onLoadSaveFiles(this, SaveFilesCallback.State.PRE); + + // Register saves add( settingsSave = new SettingsSave(settingsManager), accountsSave = new AccountsSave() ); - } - public void init() { + // Load save files for (AbstractSave save : saves) { save.init(); } + // Save the save files on shutdown Runtime.getRuntime().addShutdownHook(new Thread(() -> { for (AbstractSave save : saves) { save.save(); } })); + + SaveFilesCallback.EVENT.invoker().onLoadSaveFiles(this, SaveFilesCallback.State.POST); } public void add(final AbstractSave... saves) { diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/base/VFPListEntry.java b/src/main/java/de/florianmichael/viafabricplus/screen/base/VFPListEntry.java index 5ac66b68..37feb32c 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/base/VFPListEntry.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/base/VFPListEntry.java @@ -26,6 +26,8 @@ import net.minecraft.text.Text; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; +import javax.annotation.Nullable; + /** * This class is a wrapper for the {@link net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget.Entry} class which provides some global * functions and features used in all screens which are added by ViaFabricPlus @@ -34,7 +36,14 @@ public abstract class VFPListEntry extends AlwaysSelectedEntryListWidget.Entry= x && mouseX <= x + entryWidth && mouseY >= y && mouseY <= y + entryHeight) { + context.drawTooltip(MinecraftClient.getInstance().textRenderer, tooltip, mouseX - x, mouseY - y); + } + } + /** * Automatically draws a background for the slot with the slot's dimension and calls the {@link #mappedRender(DrawContext, int, int, int, int, int, int, int, boolean, float)} method */ @Override public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + // Allows cross sharing of global variables between util methods + this.context = context; + this.x = x; + this.y = y; + this.entryWidth = entryWidth; + this.entryHeight = entryHeight; + final var matrices = context.getMatrices(); matrices.push(); diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/settings/BooleanSettingRenderer.java b/src/main/java/de/florianmichael/viafabricplus/screen/settings/BooleanSettingRenderer.java index 28926df4..a17cc7f0 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/settings/BooleanSettingRenderer.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/settings/BooleanSettingRenderer.java @@ -53,7 +53,10 @@ public class BooleanSettingRenderer extends VFPListEntry { final Text text = this.value.getValue() ? Text.translatable("base.viafabricplus.on") : Text.translatable("base.viafabricplus.off"); final var offset = textRenderer.getWidth(text) + 6; - renderScrollableText(context, this.value.getName().formatted(Formatting.GRAY), x, y, entryWidth, entryHeight, offset); + renderScrollableText(this.value.getName().formatted(Formatting.GRAY), offset); context.drawTextWithShadow(textRenderer, text, entryWidth - offset, entryHeight / 2 - textRenderer.fontHeight / 2, this.value.getValue() ? Color.GREEN.getRGB() : Color.RED.getRGB()); + + renderTooltip(value.getTooltip(), mouseX, mouseY); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/settings/ButtonSettingRenderer.java b/src/main/java/de/florianmichael/viafabricplus/screen/settings/ButtonSettingRenderer.java index afd015fc..f3869b5c 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/settings/ButtonSettingRenderer.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/settings/ButtonSettingRenderer.java @@ -48,5 +48,8 @@ public class ButtonSettingRenderer extends VFPListEntry { final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; context.drawCenteredTextWithShadow(textRenderer, this.value.displayValue(), entryWidth / 2, entryHeight / 2 - textRenderer.fontHeight / 2, -1); + + renderTooltip(value.getTooltip(), mouseX, mouseY); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/settings/ModeSettingRenderer.java b/src/main/java/de/florianmichael/viafabricplus/screen/settings/ModeSettingRenderer.java index 9a6520f1..f97d8f52 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/settings/ModeSettingRenderer.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/settings/ModeSettingRenderer.java @@ -52,7 +52,10 @@ public class ModeSettingRenderer extends VFPListEntry { final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; final var offset = textRenderer.getWidth(this.value.getValue()) + 6; - renderScrollableText(context, this.value.getName().formatted(Formatting.GRAY), x, y, entryWidth, entryHeight, offset); + renderScrollableText(this.value.getName().formatted(Formatting.GRAY), offset); context.drawTextWithShadow(textRenderer, this.value.getValue(), entryWidth - offset, entryHeight / 2 - textRenderer.fontHeight / 2, -1); + + renderTooltip(value.getTooltip(), mouseX, mouseY); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/settings/TitleRenderer.java b/src/main/java/de/florianmichael/viafabricplus/screen/settings/TitleRenderer.java index 9ea78a75..ab8f69e0 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/settings/TitleRenderer.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/settings/TitleRenderer.java @@ -55,4 +55,5 @@ public class TitleRenderer extends VFPListEntry { context.drawTextWithShadow(textRenderer, this.name.copy().formatted(Formatting.BOLD), 3, entryHeight / 2 - textRenderer.fontHeight / 2, -1); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/settings/VersionedBooleanSettingRenderer.java b/src/main/java/de/florianmichael/viafabricplus/screen/settings/VersionedBooleanSettingRenderer.java index 08087adf..2bf28a99 100644 --- a/src/main/java/de/florianmichael/viafabricplus/screen/settings/VersionedBooleanSettingRenderer.java +++ b/src/main/java/de/florianmichael/viafabricplus/screen/settings/VersionedBooleanSettingRenderer.java @@ -55,7 +55,10 @@ public class VersionedBooleanSettingRenderer extends VFPListEntry { Color color = this.value.isAuto() ? Color.ORANGE : this.value.isEnabled() ? Color.GREEN : Color.RED; final var offset = textRenderer.getWidth(text) + 6; - renderScrollableText(context, Text.of(Formatting.GRAY + this.value.getName().getString() + " " + Formatting.RESET + this.value.getProtocolRange().toString()), x, y, entryWidth, entryHeight, offset); + renderScrollableText(Text.of(Formatting.GRAY + this.value.getName().getString() + " " + Formatting.RESET + this.value.getProtocolRange().toString()), offset); context.drawTextWithShadow(textRenderer, text, entryWidth - offset, entryHeight / 2 - textRenderer.fontHeight / 2, color.getRGB()); + + renderTooltip(value.getTooltip(), mouseX, mouseY); } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/settings/SettingsManager.java b/src/main/java/de/florianmichael/viafabricplus/settings/SettingsManager.java index 3796dd72..3cf4fc63 100644 --- a/src/main/java/de/florianmichael/viafabricplus/settings/SettingsManager.java +++ b/src/main/java/de/florianmichael/viafabricplus/settings/SettingsManager.java @@ -31,7 +31,7 @@ public class SettingsManager { private final List groups = new ArrayList<>(); public SettingsManager() { - RegisterSettingsCallback.EVENT.invoker().onInitializeSettings(RegisterSettingsCallback.State.PRE); + RegisterSettingsCallback.EVENT.invoker().onRegisterSettings(this, RegisterSettingsCallback.State.PRE); addGroup( GeneralSettings.global(), @@ -41,7 +41,7 @@ public class SettingsManager { DebugSettings.global() ); - RegisterSettingsCallback.EVENT.invoker().onInitializeSettings(RegisterSettingsCallback.State.POST); + RegisterSettingsCallback.EVENT.invoker().onRegisterSettings(this, RegisterSettingsCallback.State.POST); } public void addGroup(final SettingGroup... groups) { diff --git a/src/main/java/de/florianmichael/viafabricplus/settings/base/AbstractSetting.java b/src/main/java/de/florianmichael/viafabricplus/settings/base/AbstractSetting.java index b8b7b006..10ca7ec6 100644 --- a/src/main/java/de/florianmichael/viafabricplus/settings/base/AbstractSetting.java +++ b/src/main/java/de/florianmichael/viafabricplus/settings/base/AbstractSetting.java @@ -23,6 +23,7 @@ import com.google.gson.JsonObject; import de.florianmichael.viafabricplus.screen.base.VFPListEntry; import de.florianmichael.viafabricplus.util.ChatUtil; import net.minecraft.text.MutableText; +import net.minecraft.text.Text; /** * This class is the base for all settings. It contains the name, the default value and the current value. @@ -36,6 +37,8 @@ public abstract class AbstractSetting { private T value; + private Text tooltip; + public AbstractSetting(final SettingGroup parent, final MutableText name, final T defaultValue) { this.name = name; this.defaultValue = defaultValue; @@ -87,4 +90,12 @@ public abstract class AbstractSetting { this.value = value; } + public Text getTooltip() { + return tooltip; + } + + public void setTooltip(Text tooltip) { + this.tooltip = tooltip; + } + } diff --git a/src/main/java/de/florianmichael/viafabricplus/settings/impl/GeneralSettings.java b/src/main/java/de/florianmichael/viafabricplus/settings/impl/GeneralSettings.java index 43a5f3d6..ea6572f7 100644 --- a/src/main/java/de/florianmichael/viafabricplus/settings/impl/GeneralSettings.java +++ b/src/main/java/de/florianmichael/viafabricplus/settings/impl/GeneralSettings.java @@ -60,6 +60,7 @@ public class GeneralSettings extends SettingGroup { public GeneralSettings() { super(Text.translatable("setting_group_name.viafabricplus.general")); + emulateInventoryActionsInAlphaVersions.setTooltip(Text.translatable("base.viafabricplus.this_will_require_a_restart")); } public static GeneralSettings global() { @@ -75,4 +76,5 @@ public class GeneralSettings extends SettingGroup { default -> builder; }; } + } diff --git a/src/main/resources/assets/viafabricplus/lang/en_us.json b/src/main/resources/assets/viafabricplus/lang/en_us.json index 9ad79bbb..c6f74339 100644 --- a/src/main/resources/assets/viafabricplus/lang/en_us.json +++ b/src/main/resources/assets/viafabricplus/lang/en_us.json @@ -25,6 +25,7 @@ "base.viafabricplus.cancel_and_notify": "Cancel and notify", "base.viafabricplus.force_version_title": "Please select the version with which the server should be pinged/connected", "base.viafabricplus.detecting_server_version": "Detecting server version...", + "base.viafabricplus.this_will_require_a_restart": "This will require a restart!", "setting_group_name.viafabricplus.authentication": "Authentication", "setting_group_name.viafabricplus.visual": "Visual",