summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/config
diff options
context:
space:
mode:
authorLorenz <ESs95s3P5z8Pheb>2022-07-14 12:06:07 +0200
committerLorenz <ESs95s3P5z8Pheb>2022-07-14 12:06:07 +0200
commita5c540d977a3510812cac7fac340fe17e7d10983 (patch)
treedbbe5b208e6871378a10868d1206d1d78beeb950 /src/main/java/at/hannibal2/skyhanni/config
parentd6c99ed30a2b1cb228b2fdc3d3178cf1f369dc53 (diff)
downloadskyhanni-a5c540d977a3510812cac7fac340fe17e7d10983.tar.gz
skyhanni-a5c540d977a3510812cac7fac340fe17e7d10983.tar.bz2
skyhanni-a5c540d977a3510812cac7fac340fe17e7d10983.zip
renamed mod to SkyHanni
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/config')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/Features.java274
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/GuiTextures.java32
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/commands/Commands.java26
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java60
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/config/ConfigEditor.java602
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/BackgroundBlur.java249
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/ChromaColour.java93
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GlScissorStack.java86
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GuiElement.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GuiElementBoolean.java118
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GuiElementColour.java370
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GuiElementTextField.java549
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/GuiScreenElementWrapper.java34
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/Config.java5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/KeybindHelper.java49
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/Position.java197
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/Category.java14
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigAccordionId.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorAccordion.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorBoolean.java11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorButton.java14
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorColour.java11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorDraggableList.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorDropdown.java14
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorKeybind.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorSlider.java16
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorStyle.java11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigEditorText.java11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/annotations/ConfigOption.java16
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditor.java62
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorAccordion.java80
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorBoolean.java37
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorButton.java60
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorColour.java74
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorDraggableList.java269
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorDropdown.java145
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorKeybind.java88
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorSlider.java136
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorStyle.java42
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiOptionEditorText.java78
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/gui/GuiPositionEditor.java172
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/config/struct/ConfigProcessor.java167
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/GuiElementSlider.java121
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/StringUtils.java8
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/lerp/LerpUtils.java25
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/lerp/LerpingFloat.java68
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/lerp/LerpingInteger.java76
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/render/RenderUtils.java155
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/core/util/render/TextRenderUtils.java155
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/textures/TextureObject.java37
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/textures/Textures.java54
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/utils/Utils.java367
52 files changed, 5398 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/config/Features.java b/src/main/java/at/hannibal2/skyhanni/config/Features.java
new file mode 100644
index 000000000..90027ce4e
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/Features.java
@@ -0,0 +1,274 @@
+package at.hannibal2.skyhanni.config;
+
+import at.hannibal2.skyhanni.config.core.GuiElement;
+import at.hannibal2.skyhanni.config.core.GuiScreenElementWrapper;
+import at.hannibal2.skyhanni.config.core.config.Position;
+import at.hannibal2.skyhanni.config.core.config.annotations.*;
+import at.hannibal2.skyhanni.config.core.config.gui.GuiPositionEditor;
+import at.hannibal2.skyhanni.SkyHanniMod;
+import at.hannibal2.skyhanni.config.config.ConfigEditor;
+import com.google.gson.annotations.Expose;
+import net.minecraft.client.Minecraft;
+
+public class Features {
+
+ private void editOverlay(String activeConfig, int width, int height, Position position) {
+ Minecraft.getMinecraft().displayGuiScreen(new GuiPositionEditor(position, width, height, () -> {}, () -> {}, () -> SkyHanniMod.screenToOpen = new GuiScreenElementWrapper(new ConfigEditor(SkyHanniMod.feature, activeConfig))));
+ }
+
+ public void executeRunnable(String runnableId) {
+ String activeConfigCategory = null;
+ if (Minecraft.getMinecraft().currentScreen instanceof GuiScreenElementWrapper) {
+ GuiScreenElementWrapper wrapper = (GuiScreenElementWrapper) Minecraft.getMinecraft().currentScreen;
+ GuiElement element = wrapper.element;
+ if (element instanceof ConfigEditor) {
+ activeConfigCategory = ((ConfigEditor) element).getSelectedCategoryName();
+ }
+ }
+
+ if (runnableId.equals("petDisplay")) {
+ editOverlay(activeConfigCategory, 200, 16, misc.petDisplayPos);
+ return;
+ }
+
+ if (runnableId.equals("testPos")) {
+ editOverlay(activeConfigCategory, 200, 16, debug.testPos);
+ return;
+ }
+
+ if (runnableId.equals("dungeonMilestoneDisplay")) {
+ editOverlay(activeConfigCategory, 200, 16, dungeon.milestoneDisplayPos);
+ return;
+ }
+
+ if (runnableId.equals("dungeonDeathCounter")) {
+ editOverlay(activeConfigCategory, 200, 16, dungeon.deathCounterDisplay);
+ return;
+ }
+ }
+
+ @Expose
+ @Category(name = "Chat", desc = "Chat related features.")
+ public Chat chat = new Chat();
+
+ @Expose
+ @Category(name = "Dungeon", desc = "Features that change the catacombs dungeon experience.")
+ public Dungeon dungeon = new Dungeon();
+
+ @Expose
+ @Category(name = "Items", desc = "Changing the behavior around items and the inventory.")
+ public Items items = new Items();
+
+ @Expose
+ @Category(name = "Bazaar", desc = "Bazaar settings.")
+ public Bazaar bazaar = new Bazaar();
+
+ @Expose
+ @Category(name = "Misc", desc = "Settings without a category.")
+ public Misc misc = new Misc();
+
+ @Expose
+ @Category(name = "Debug", desc = "Debug and test stuff.")
+ public Debug debug = new Debug();
+
+ public static class Chat {
+
+ @Expose
+ @ConfigOption(name = "Chat Filter Types", desc = "")
+ @ConfigEditorAccordion(id = 1)
+ public boolean filterTypes = false;
+
+ @Expose
+ @ConfigOption(name = "HyPixel Hub", desc = "Block messages outside SkyBlock in the HyPixel lobby: player joins, loot boxes, prototype lobby messages, radiating generosity and HyPixel tournaments.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 1)
+ public boolean hypixelHub = false;
+
+ @Expose
+ @ConfigOption(name = "Empty", desc = "Hide all the empty messages from the chat.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 1)
+ public boolean empty = false;
+
+ @Expose
+ @ConfigOption(name = "Warping", desc = "Block 'sending request to join ..' and 'warping ..' messages.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 1)
+ public boolean warping = false;
+
+ @Expose
+ @ConfigOption(name = "Welcome", desc = "Hide the 'welcome to skyblock' message.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 1)
+ public boolean welcome = false;
+
+ //TODO remove
+ @Expose
+ @ConfigOption(name = "Others", desc = "Hide other annoying messages.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 1)
+ public boolean others = false;
+
+ @Expose
+ @ConfigOption(name = "Player Messages", desc = "Add a fancy new chat format for player messages.")
+ @ConfigEditorBoolean
+ public boolean playerMessages = false;
+
+ @Expose
+ @ConfigOption(name = "Dungeon Filter", desc = "Hide annoying messages inside dungeon.")
+ @ConfigEditorBoolean
+ public boolean dungeonMessages = false;
+
+ @Expose
+ @ConfigOption(name = "Dungeon Boss Messages", desc = "Hide messages from watcher and bosses inside dungeon.")
+ @ConfigEditorBoolean
+ public boolean dungeonBossMessages = false;
+ }
+
+ public static class Dungeon {
+
+ @Expose
+ @ConfigOption(name = "Clicked Blocks", desc = "Highlight the following blocks when clicked in dungeon: Lever, Chest, Wither Essence")
+ @ConfigEditorBoolean
+ public boolean highlightClickedBlocks = false;
+
+ @Expose
+ @ConfigOption(name = "Boss Damage Indicator", desc = "Show the missing health of a boss in the dungeon and the cooldown time until the boss becomes attackable.")
+ @ConfigEditorBoolean
+ public boolean bossDamageIndicator = false;
+
+ @Expose
+ @ConfigOption(name = "Milestone Display", desc = "Show the current milestone inside Dungeons.")
+ @ConfigEditorBoolean
+ public boolean showMilestoneDisplay = false;
+
+ @Expose
+ @ConfigOption(name = "Milestone Display Position", desc = "")
+ @ConfigEditorButton(runnableId = "dungeonMilestoneDisplay", buttonText = "Edit")
+ public Position milestoneDisplayPos = new Position(10, 10, false, true);
+
+ @Expose
+ @ConfigOption(name = "Death Counter", desc = "Display the total amount of deaths in the current dungeon.")
+ @ConfigEditorBoolean
+ public boolean deathCounter = false;
+
+ @Expose
+ @ConfigOption(name = "Death Counter Position", desc = "")
+ @ConfigEditorButton(runnableId = "dungeonDeathCounter", buttonText = "Edit")
+ public Position deathCounterDisplay = new Position(10, 10, false, true);
+
+ @Expose
+ @ConfigOption(name = "Clean End", desc = "Hide entities and particles after the boss in Floor 1 - 6 has died.")
+ @ConfigEditorBoolean
+ public boolean cleanEnd = false;
+
+ @Expose
+ @ConfigOption(name = "Ignore Guardians", desc = "Ignore F3 and M3 guardians from the clean end feature when sneaking. Makes it easier to kill them after the boss died already. Thanks hypixel.")
+ @ConfigEditorBoolean
+ public boolean cleanEndF3IgnoreGuardians = false;
+ }
+
+ public static class Items {
+
+ @Expose
+ @ConfigOption(name = "Not Clickable Items", desc = "Hide items that are not clickable in " + "the current inventory: ah, bz, accessory bag, etc")
+ @ConfigEditorBoolean
+ public boolean hideNotClickableItems = false;
+
+ @Expose
+ @ConfigOption(name = "Item number as stack size", desc = "")
+ @ConfigEditorAccordion(id = 2)
+ public boolean filterTypes = false;
+
+ @Expose
+ @ConfigOption(name = "Master Star Number", desc = "Show the Tier of the Master Star.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayMasterStarNumber = false;
+
+ @Expose
+ @ConfigOption(name = "Master Skull Number", desc = "Show the tier of the Master Skull accessory.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayMasterSkullNumber = false;
+
+ @Expose
+ @ConfigOption(name = "Dungeon Head Floor", desc = "Show the correct floor for golden and diamond heads.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayDungeonHeadFloor = false;
+
+ @Expose
+ @ConfigOption(name = "New Year Cake", desc = "Show the Number of the Year of New Year Cakes.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayNewYearCakeNumber = false;
+
+ @Expose
+ @ConfigOption(name = "Pet Level", desc = "Show the level of the pet when not maxed.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayPetLevel = false;
+
+ @Expose
+ @ConfigOption(name = "Sack Name", desc = "Show an abbreviation of the Sack name.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displaySackName = false;
+
+ @Expose
+ @ConfigOption(name = "Minion Tier", desc = "Show the Minion Tier over Items.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 2)
+ public boolean displayMinionTier = false;
+
+ @Expose
+ @ConfigOption(name = "Ability Cooldown", desc = "Show the cooldown of item abilities.")
+ @ConfigEditorBoolean
+ public boolean itemAbilityCooldown = false;
+ }
+
+ public static class Bazaar {
+
+ @Expose
+ @ConfigOption(name = "Order Helper", desc = "Show visual hints inside the Bazaar Manage Order view when items are ready to pickup or outbid.")
+ @ConfigEditorBoolean
+ public boolean orderHelper = false;
+ }
+
+ public static class Misc {
+
+ @Expose
+ @ConfigOption(name = "Pet Display", desc = "Show the currently active pet.")
+ @ConfigEditorBoolean
+ public boolean petDisplay = false;
+
+ @Expose
+ @ConfigOption(name = "Pet Display Position", desc = "")
+ @ConfigEditorButton(runnableId = "petDisplay", buttonText = "Edit")
+ public Position petDisplayPos = new Position(10, 10, false, true);
+
+ @Expose
+ @ConfigOption(name = "Exp Bottles", desc = "Hides all the experience bottles lying on the ground.")
+ @ConfigEditorBoolean
+ public boolean hideExpBottles = false;
+
+ @Expose
+ @ConfigOption(name = "Config Button", desc = "Add a button to the pause menu to configure SkyHanni.")
+ @ConfigEditorBoolean
+ public boolean configButtonOnPause = true;
+ }
+
+ public static class Debug {
+
+ @Expose
+ @ConfigOption(name = "Enable Test", desc = "Enable Test logic")
+ @ConfigEditorBoolean
+ public boolean enabled = false;
+
+ @Expose
+ @ConfigOption(name = "Test Location", desc = "")
+ @ConfigEditorButton(runnableId = "testPos", buttonText = "Edit")
+ public Position testPos = new Position(10, 10, false, true);
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/GuiTextures.java b/src/main/java/at/hannibal2/skyhanni/config/GuiTextures.java
new file mode 100644
index 000000000..8f96fd9f2
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/GuiTextures.java
@@ -0,0 +1,32 @@
+package at.hannibal2.skyhanni.config;
+
+import net.minecraft.util.ResourceLocation;
+
+public class GuiTextures {
+
+ private GuiTextures() {}
+
+ public static final ResourceLocation DISCORD = new ResourceLocation("skyhanni:discord.png");
+
+ public static final ResourceLocation button_tex = new ResourceLocation("skyhanni:button.png");
+
+ public static final ResourceLocation button_white = new ResourceLocation("skyhanni:button_white.png");
+
+ public static final ResourceLocation BAR = new ResourceLocation("skyhanni:core/bar.png");
+ public static final ResourceLocation OFF = new ResourceLocation("skyhanni:core/toggle_off.png");
+ public static final ResourceLocation ONE = new ResourceLocation("skyhanni:core/toggle_1.png");
+ public static final ResourceLocation TWO = new ResourceLocation("skyhanni:core/toggle_2.png");
+ public static final ResourceLocation THREE = new ResourceLocation("skyhanni:core/toggle_3.png");
+ public static final ResourceLocation ON = new ResourceLocation("skyhanni:core/toggle_on.png");
+ public static final ResourceLocation DELETE = new ResourceLocation("skyhanni:core/delete.png");
+
+ public static final ResourceLocation slider_off_cap = new ResourceLocation("skyhanni:core/slider/slider_off_cap.png");
+ public static final ResourceLocation slider_off_notch = new ResourceLocation("skyhanni:core/slider/slider_off_notch.png");
+ public static final ResourceLocation slider_off_segment = new ResourceLocation("skyhanni:core/slider/slider_off_segment.png");
+ public static final ResourceLocation slider_on_cap = new ResourceLocation("skyhanni:core/slider/slider_on_cap.png");
+ public static final ResourceLocation slider_on_notch = new ResourceLocation("skyhanni:core/slider/slider_on_notch.png");
+ public static final ResourceLocation slider_on_segment = new ResourceLocation("skyhanni:core/slider/slider_on_segment.png");
+ public static final ResourceLocation slider_button_new = new ResourceLocation("skyhanni:core/slider/slider_button.png");
+
+ public static final ResourceLocation mapOverlay = new ResourceLocation("skyhanni", "maps/map_overlay.png");
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.java b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.java
new file mode 100644
index 000000000..dbf4e12c9
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.java
@@ -0,0 +1,26 @@
+package at.hannibal2.skyhanni.config.commands;
+
+import at.hannibal2.skyhanni.SkyHanniMod;
+import at.hannibal2.skyhanni.config.core.GuiScreenElementWrapper;
+import at.hannibal2.skyhanni.config.config.ConfigEditor;
+import net.minecraft.command.ICommandSender;
+import net.minecraftforge.client.ClientCommandHandler;
+import org.apache.commons.lang3.StringUtils;
+
+public class Commands {
+
+ private static final SimpleCommand.ProcessCommandRunnable settingsRunnable = new SimpleCommand.ProcessCommandRunnable() {
+ public void processCommand(ICommandSender sender, String[] args) {
+ if (args.length > 0) {
+ SkyHanniMod.screenToOpen = new GuiScreenElementWrapper(new ConfigEditor(SkyHanniMod.feature, StringUtils.join(args, " ")));
+ } else {
+ SkyHanniMod.screenToOpen = new GuiScreenElementWrapper(new ConfigEditor(SkyHanniMod.feature));
+ }
+ }
+ };
+
+ public static void init() {
+ ClientCommandHandler.instance.registerCommand(new SimpleCommand("sh", settingsRunnable));
+ ClientCommandHandler.instance.registerCommand(new SimpleCommand("skyhanni", settingsRunnable));
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java
new file mode 100644
index 000000000..de03ee2bd
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/commands/SimpleCommand.java
@@ -0,0 +1,60 @@
+package at.hannibal2.skyhanni.config.commands;
+
+import java.util.List;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.util.BlockPos;
+
+/**
+ @author Moulberry
+ **/
+public class SimpleCommand extends CommandBase {
+
+ private final String commandName;
+ private final ProcessCommandRunnable runnable;
+ private TabCompleteRunnable tabRunnable;
+
+ public SimpleCommand(String commandName, ProcessCommandRunnable runnable) {
+ this.commandName = commandName;
+ this.runnable = runnable;
+ }
+
+ public SimpleCommand(String commandName, ProcessCommandRunnable runnable, TabCompleteRunnable tabRunnable) {
+ this.commandName = commandName;
+ this.runnable = runnable;
+ this.tabRunnable = tabRunnable;
+ }
+
+ public abstract static class ProcessCommandRunnable {
+
+ public abstract void processCommand(ICommandSender sender, String[] args);
+ }
+
+ public abstract static class TabCompleteRunnable {
+
+ public abstract List<String> tabComplete(ICommandSender sender, String[] args, BlockPos pos);
+ }
+
+ public boolean canCommandSenderUseCommand(ICommandSender sender) {
+ return true;
+ }
+
+ public String getCommandName() {
+ return commandName;
+ }
+
+ public String getCommandUsage(ICommandSender sender) {
+ return "/" + commandName;
+ }
+
+ @Override
+ public void processCommand(ICommandSender sender, String[] args) {
+ runnable.processCommand(sender, args);
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (tabRunnable != null) return tabRunnable.tabComplete(sender, args, pos);
+ return null;
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/config/ConfigEditor.java b/src/main/java/at/hannibal2/skyhanni/config/config/ConfigEditor.java
new file mode 100644
index 000000000..72e46ad1d
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/config/ConfigEditor.java
@@ -0,0 +1,602 @@
+package at.hannibal2.skyhanni.config.config;
+
+import at.hannibal2.skyhanni.SkyHanniMod;
+import at.hannibal2.skyhanni.config.Features;
+import at.hannibal2.skyhanni.config.GuiTextures;
+import at.hannibal2.skyhanni.config.core.GlScissorStack;
+import at.hannibal2.skyhanni.config.core.GuiElement;
+import at.hannibal2.skyhanni.config.core.config.gui.GuiOptionEditor;
+import at.hannibal2.skyhanni.config.core.config.gui.GuiOptionEditorAccordion;
+import at.hannibal2.skyhanni.config.core.config.struct.ConfigProcessor;
+import at.hannibal2.skyhanni.config.core.util.lerp.LerpUtils;
+import at.hannibal2.skyhanni.config.core.util.lerp.LerpingInteger;
+import at.hannibal2.skyhanni.config.core.util.render.RenderUtils;
+import at.hannibal2.skyhanni.config.core.util.render.TextRenderUtils;
+
+import com.google.common.collect.Lists;
+import java.awt.*;
+import java.net.URI;
+import java.util.*;
+import java.util.List;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+
+public class ConfigEditor extends GuiElement {
+
+ private static final ResourceLocation[] socialsIco = new ResourceLocation[] { GuiTextures.DISCORD };
+ private static final String[] socialsLink = new String[] { "https://discord.gg/8DXVN4BJz3" };
+
+ private final long openedMillis;