aboutsummaryrefslogtreecommitdiff
path: root/versions
diff options
context:
space:
mode:
authorWyvest <45589059+Wyvest@users.noreply.github.com>2022-07-02 06:12:23 +0700
committerWyvest <45589059+Wyvest@users.noreply.github.com>2022-07-02 06:12:23 +0700
commitd4bb5a94308d4379ef3d6cc7b9221ea0d98ff051 (patch)
tree9bb9b53e2823f73084780673763504f4098bae69 /versions
parentd2b1d57120bb51e76191302a58d935afe52b89df (diff)
downloadOneConfig-d4bb5a94308d4379ef3d6cc7b9221ea0d98ff051.tar.gz
OneConfig-d4bb5a94308d4379ef3d6cc7b9221ea0d98ff051.tar.bz2
OneConfig-d4bb5a94308d4379ef3d6cc7b9221ea0d98ff051.zip
Separate Minecraft dependant and non-dependant code
Diffstat (limited to 'versions')
-rw-r--r--versions/build.gradle.kts306
-rw-r--r--versions/root.gradle.kts9
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/events/event/ChatReceiveEvent.java22
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/events/event/ReceivePacketEvent.java11
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/events/event/ScreenOpenEvent.java17
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/events/event/SendPacketEvent.java11
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/events/event/TimerUpdateEvent.java24
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java93
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/gui/impl/BlurHandlerImpl.java132
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/GuiIngameForgeMixin.java19
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/MinecraftMixin.java100
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/NetHandlerPlayClientMixin.java38
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/NetworkManagerMixin.java25
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/OptifineConfigMixin.java23
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/ShaderGroupAccessor.java16
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/VigilantMixin.java10
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/mixin/WorldClientMixin.java23
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/asm/ClassTransformer.java102
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/asm/ITransformer.java24
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/asm/OneConfigTweaker.java117
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/asm/tweakers/NanoVGGLConfigTransformer.java47
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/asm/tweakers/VigilantTransformer.java89
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/hooks/Lwjgl2FunctionProvider.java47
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/hooks/OptifineConfigHook.java22
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/internal/plugin/hooks/VigilantHook.java26
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/GLPlatformImpl.java67
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/GuiPlatformImpl.java31
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/I18nPlatformImpl.java13
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/LoaderPlatformImpl.java26
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/MousePlatformImpl.java53
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/PlatformImpl.java12
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/platform/impl/ServerPlatformImpl.java22
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/utils/commands/PlatformCommandManagerImpl.java330
-rw-r--r--versions/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java100
-rw-r--r--versions/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/DSLs.kt9
-rw-r--r--versions/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/GuiUtilsDSL.kt11
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.internal.gui.BlurHandler1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.GLPlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.GuiPlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.I18nPlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.LoaderPlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.MousePlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.Platform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.platform.ServerPlatform1
-rw-r--r--versions/src/main/resources/META-INF/services/cc.polyfrost.oneconfig.utils.commands.PlatformCommandManager1
-rw-r--r--versions/src/main/resources/mixins.oneconfig.json21
46 files changed, 2057 insertions, 0 deletions
diff --git a/versions/build.gradle.kts b/versions/build.gradle.kts
new file mode 100644
index 0000000..939e61b
--- /dev/null
+++ b/versions/build.gradle.kts
@@ -0,0 +1,306 @@
+import gg.essential.gradle.util.RelocationTransform.Companion.registerRelocationAttribute
+import gg.essential.gradle.util.noServerRunConfigs
+import gg.essential.gradle.util.prebundle
+import net.fabricmc.loom.task.RemapSourcesJarTask
+
+
+plugins {
+ kotlin("jvm")
+ id("gg.essential.multi-version")
+ id("gg.essential.defaults.repo")
+ id("gg.essential.defaults.java")
+ id("gg.essential.defaults.loom")
+ id("net.kyori.blossom") version "1.3.0"
+ id("org.jetbrains.dokka") version "1.6.21"
+ id("maven-publish")
+ id("signing")
+ java
+}
+
+kotlin.jvmToolchain {
+ (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(8))
+}
+
+java {
+ withSourcesJar()
+}
+
+val mod_name: String by project
+val mod_version: String by project
+val mod_id: String by project
+
+preprocess {
+ vars.put("MODERN", if (project.platform.mcMinor >= 16) 1 else 0)
+}
+
+blossom {
+ replaceToken("@VER@", mod_version)
+ replaceToken("@NAME@", mod_name)
+ replaceToken("@ID@", mod_id)
+}
+
+version = mod_version
+group = "cc.polyfrost"
+base {
+ archivesName.set("$mod_id-$platform")
+}
+loom {
+ noServerRunConfigs()
+ if (project.platform.isLegacyForge) {
+ launchConfigs.named("client") {
+ arg("--tweakClass", "cc.polyfrost.oneconfig.internal.plugin.asm.OneConfigTweaker")
+ property("mixin.debug.export", "true")
+ property("debugBytecode", "true")
+ }
+ }
+ if (project.platform.isForge) {
+ forge {
+ mixinConfig("mixins.${mod_id}.json")
+ }
+ }
+ mixin.defaultRefmapName.set("mixins.${mod_id}.refmap.json")
+}
+
+repositories {
+ maven("https://repo.polyfrost.cc/releases")
+}
+
+val relocated = registerRelocationAttribute("relocate") {
+ relocate("gg.essential", "cc.polyfrost.oneconfig.libs")
+ relocate("me.kbrewster", "cc.polyfrost.oneconfig.libs")
+ relocate("com.github.benmanes", "cc.polyfrost.oneconfig.libs")
+ relocate("com.google", "cc.polyfrost.oneconfig.libs")
+ relocate("org.checkerframework", "cc.polyfrost.oneconfig.libs")
+ remapStringsIn("com.github.benmanes.caffeine.cache.LocalCacheFactory")
+ remapStringsIn("com.github.benmanes.caffeine.cache.NodeFactory")
+}
+
+val shadeRelocated: Configuration by configurations.creating {
+ attributes { attribute(relocated, true) }
+}
+
+val shade: Configuration by configurations.creating {
+ configurations.api.get().extendsFrom(this)
+}
+
+val shadeNoPom: Configuration by configurations.creating
+
+sourceSets {
+ main {
+ output.setResourcesDir(java.classesDirectory)
+ }
+}
+
+dependencies {
+ compileOnly("gg.essential:vigilance-$platform:222") {
+ isTransitive = false
+ }
+
+ shadeRelocated("gg.essential:universalcraft-$platform:211") {
+ isTransitive = false
+ }
+
+ shadeRelocated("com.github.KevinPriv:keventbus:c52e0a2ea0") {
+ isTransitive = false
+ }
+
+ @Suppress("GradlePackageUpdate")
+ shadeRelocated("com.github.ben-manes.caffeine:caffeine:2.9.3")
+
+ // for other mods and universalcraft
+ val kotlinVersion: String by project
+ val coroutinesVersion: String by project
+ val serializationVersion: String by project
+ val atomicfuVersion: String by project
+ shade("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
+ shade("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
+ shade("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion")
+ shade("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
+
+ shade("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
+ shade("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$coroutinesVersion")
+ shade("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVersion")
+ shade("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:$serializationVersion")
+ shade("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:$serializationVersion")
+ shade("org.jetbrains.kotlinx:kotlinx-serialization-cbor-jvm:$serializationVersion")
+ shade("org.jetbrains.kotlinx:atomicfu-jvm:$atomicfuVersion")
+
+ shade("org.spongepowered:mixin:0.7.11-SNAPSHOT") {
+ isTransitive = false
+ }
+ shadeNoPom(project(":")) {
+ isTransitive = false
+ }
+ shade("cc.polyfrost:lwjgl:1.0.0-alpha1")
+ shadeNoPom(prebundle(shadeRelocated))
+
+ dokkaHtmlPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.6.21")
+
+ configurations.named(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME) { extendsFrom(shadeNoPom) }
+ configurations.named(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME) { extendsFrom(shadeNoPom) }
+}
+
+tasks {
+ processResources {
+ inputs.property("id", mod_id)
+ inputs.property("name", mod_name)
+ val java = if (project.platform.mcMinor >= 18) {
+ 17
+ } else {
+ if (project.platform.mcMinor == 17) 16 else 8
+ }
+ val compatLevel = "JAVA_${java}"
+ inputs.property("java", java)
+ inputs.property("java_level", compatLevel)
+ inputs.property("version", mod_version)
+ inputs.property("mcVersionStr", project.platform.mcVersionStr)
+ filesMatching(listOf("mcmod.info", "mixins.${mod_id}.json", "mods.toml")) {
+ expand(
+ mapOf(
+ "id" to mod_id,
+ "name" to mod_name,
+ "java" to java,
+ "java_level" to compatLevel,
+ "version" to mod_version,
+ "mcVersionStr" to project.platform.mcVersionStr
+ )
+ )
+ }
+ filesMatching("fabric.mod.json") {
+ expand(
+ mapOf(
+ "id" to mod_id,
+ "name" to mod_name,
+ "java" to java,
+ "java_level" to compatLevel,
+ "version" to mod_version,
+ "mcVersionStr" to project.platform.mcVersionStr.substringBeforeLast(".") + ".x"
+ )
+ )
+ }
+ }
+
+ withType(Jar::class.java) {
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+ if (project.platform.isFabric) {
+ exclude("mcmod.info", "mods.toml")
+ } else {
+ exclude("fabric.mod.json")
+ if (project.platform.isLegacyForge) {
+ exclude("mods.toml")
+ exclude("META-INF/versions/**")
+ exclude("**/module-info.class")
+ exclude("**/package-info.class")
+ } else {
+ exclude("mcmod.info")
+ }
+ }
+ if (!name.contains("sourcesjar", ignoreCase = true) || !name.contains("dokka", ignoreCase = true)) {
+ exclude("**/**_Test.**")
+ exclude("**/**_Test$**.**")
+ }
+ }
+
+ remapJar {
+ archiveClassifier.set("full")
+ }
+
+ fun Jar.excludeInternal() {
+ exclude("**/internal/**")
+ }
+ jar {
+ dependsOn(shadeNoPom, shade)
+ from({ ArrayList<File>().also { it.addAll(shadeNoPom); it.addAll(shade) }.map { if (it.isDirectory) it else zipTree(it) } })
+ manifest {
+ attributes(
+ mapOf(
+ "ModSide" to "CLIENT",
+ "ForceLoadAsMod" to true,
+ "TweakOrder" to "0",
+ "MixinConfigs" to "mixins.oneconfig.json",
+ "TweakClass" to "cc.polyfrost.oneconfig.internal.plugin.asm.OneConfigTweaker"
+ )
+ )
+ }
+ excludeInternal()
+ archiveClassifier.set("")
+ }
+ dokkaHtml.configure {
+ outputDirectory.set(buildDir.resolve("dokka"))
+ moduleName.set("OneConfig $platform")
+ moduleVersion.set(mod_version)
+ dokkaSourceSets {
+ configureEach {
+ jdkVersion.set(8)
+ //reportUndocumented.set(true)
+ }
+ }
+ doLast {
+ val outputFile = outputDirectory.get().resolve("images/logo-icon.svg")
+ if (outputFile.exists()) {
+ outputFile.delete()
+ }
+ val inputFile = project.rootDir.resolve("src/main/resources/assets/oneconfig/icons/OneConfig.svg")
+ inputFile.copyTo(outputFile)
+ }
+ }
+ val dokkaJar = create("dokkaJar", Jar::class.java) {
+ archiveClassifier.set("dokka")
+ group = "build"
+ dependsOn(dokkaHtml)
+ from(layout.buildDirectory.dir("dokka"))
+ }
+ named<Jar>("sourcesJar") {
+ from(project(":").sourceSets.main.map { it.allSource })
+ dependsOn(dokkaJar)
+ excludeInternal()
+ archiveClassifier.set("sources")
+ doFirst {
+ archiveClassifier.set("sources")
+ }
+ }
+ withType<RemapSourcesJarTask> {
+ enabled = false
+ }
+}
+
+publishing {
+ publications {
+ register<MavenPublication>("oneconfig-$platform") {
+ groupId = "cc.polyfrost"
+ artifactId = base.archivesName.get()
+
+ artifact(tasks["jar"])
+ artifact(tasks["remapJar"])
+ artifact(tasks["sourcesJar"])
+ artifact(tasks["dokkaJar"])
+ }
+ }
+
+ repositories {
+ maven {
+ name = "releases"
+ url = uri("https://repo.polyfrost.cc/releases")
+ credentials(PasswordCredentials::class)
+ authentication {
+ create<BasicAuthentication>("basic")
+ }
+ }
+ maven {
+ name = "snapshots"
+ url = uri("https://repo.polyfrost.cc/snapshots")
+ credentials(PasswordCredentials::class)
+ authentication {
+ create<BasicAuthentication>("basic")
+ }
+ }
+ maven {
+ name = "private"
+ url = uri("https://repo.polyfrost.cc/private")
+ credentials(PasswordCredentials::class)
+ authentication {
+ create<BasicAuthentication>("basic")
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/versions/root.gradle.kts b/versions/root.gradle.kts
new file mode 100644
index 0000000..f23a159
--- /dev/null
+++ b/versions/root.gradle.kts
@@ -0,0 +1,9 @@
+plugins {
+ kotlin("jvm") version "1.6.21" apply false
+ id("gg.essential.multi-version.root")
+ id("io.github.juuxel.loom-quiltflower-mini") version "171a6e2e49" apply false
+}
+
+preprocess {
+ "1.8.9-forge"(10809, "srg") {}
+} \ No newline at end of file
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ChatReceiveEvent.java b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ChatReceiveEvent.java
new file mode 100644
index 0000000..6585729
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ChatReceiveEvent.java
@@ -0,0 +1,22 @@
+package cc.polyfrost.oneconfig.events.event;
+
+import cc.polyfrost.oneconfig.libs.universal.wrappers.message.UTextComponent;
+import net.minecraft.util.IChatComponent;
+
+/**
+ * Called when a chat message is received.
+ */
+public class ChatReceiveEvent extends CancellableEvent {
+ /**
+ * The message that was received.
+ */
+ public final IChatComponent message;
+
+ public ChatReceiveEvent(IChatComponent message) {
+ this.message = message;
+ }
+
+ public String getFullyUnformattedMessage() {
+ return UTextComponent.Companion.stripFormatting(message.getUnformattedText());
+ }
+}
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ReceivePacketEvent.java b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ReceivePacketEvent.java
new file mode 100644
index 0000000..17bc16d
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ReceivePacketEvent.java
@@ -0,0 +1,11 @@
+package cc.polyfrost.oneconfig.events.event;
+
+import net.minecraft.network.Packet;
+
+public class ReceivePacketEvent extends CancellableEvent {
+ public final Packet<?> packet;
+
+ public ReceivePacketEvent(Packet<?> packet) {
+ this.packet = packet;
+ }
+}
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ScreenOpenEvent.java b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ScreenOpenEvent.java
new file mode 100644
index 0000000..4593638
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/ScreenOpenEvent.java
@@ -0,0 +1,17 @@
+package cc.polyfrost.oneconfig.events.event;
+
+import net.minecraft.client.gui.GuiScreen;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Called when a screen is opened or closed.
+ * If the screen is closed, {@link ScreenOpenEvent#screen} will be null.
+ */
+public class ScreenOpenEvent extends CancellableEvent {
+ @Nullable
+ public final GuiScreen screen;
+
+ public ScreenOpenEvent(@Nullable GuiScreen screen) {
+ this.screen = screen;
+ }
+}
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/events/event/SendPacketEvent.java b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/SendPacketEvent.java
new file mode 100644
index 0000000..3cee784
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/SendPacketEvent.java
@@ -0,0 +1,11 @@
+package cc.polyfrost.oneconfig.events.event;
+
+import net.minecraft.network.Packet;
+
+public class SendPacketEvent extends CancellableEvent {
+ public final Packet<?> packet;
+
+ public SendPacketEvent(Packet<?> packet) {
+ this.packet = packet;
+ }
+}
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/events/event/TimerUpdateEvent.java b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/TimerUpdateEvent.java
new file mode 100644
index 0000000..a8b88dc
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/events/event/TimerUpdateEvent.java
@@ -0,0 +1,24 @@
+package cc.polyfrost.oneconfig.events.event;
+
+import net.minecraft.util.Timer;
+
+/**
+ * Called when the {@link Timer} is updated.
+ * Can be used as an alternative to getting instances of {@link Timer}
+ * via Mixin or Access Wideners / Transformers
+ */
+public class TimerUpdateEvent {
+ /**
+ * Whether the deltaTicks / renderPartialTicks was updated
+ */
+ public final boolean updatedDeltaTicks;
+ /**
+ * The {@link Timer} instance
+ */
+ public final Timer timer;
+
+ public TimerUpdateEvent(Timer timer, boolean updatedDeltaTicks) {
+ this.timer = timer;
+ this.updatedDeltaTicks = updatedDeltaTicks;
+ }
+} \ No newline at end of file
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java b/versions/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java
new file mode 100644
index 0000000..7ecfe98
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java
@@ -0,0 +1,93 @@
+package cc.polyfrost.oneconfig.internal;
+
+import cc.polyfrost.oneconfig.events.EventManager;
+import cc.polyfrost.oneconfig.events.event.ShutdownEvent;
+import cc.polyfrost.oneconfig.internal.command.OneConfigCommand;
+import cc.polyfrost.oneconfig.internal.config.OneConfigConfig;
+import cc.polyfrost.oneconfig.internal.config.Preferences;
+import cc.polyfrost.oneconfig.internal.config.core.ConfigCore;
+import cc.polyfrost.oneconfig.internal.config.core.KeyBindHandler;
+import cc.polyfrost.oneconfig.internal.gui.BlurHandler;
+import cc.polyfrost.oneconfig.internal.hud.HudCore;
+import cc.polyfrost.oneconfig.libs.eventbus.Subscribe;
+import cc.polyfrost.oneconfig.utils.commands.CommandManager;
+import cc.polyfrost.oneconfig.utils.gui.GuiUtils;
+import cc.polyfrost.oneconfig.utils.hypixel.HypixelUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.File;
+import java.util.ServiceLoader;
+
+/**
+ * The main class of OneConfig.
+ */
+@net.minecraftforge.fml.common.Mod(modid = "@ID@", name = "@NAME@", version = "@VER@")
+public class OneConfig {
+
+ public OneConfig() {
+ EventManager.INSTANCE.register(this);
+ }
+
+ public static final File oneConfigDir = new File("./OneConfig");
+ public static final Logger LOGGER = LogManager.getLogger("@NAME@");
+ private static boolean preLaunched = false;
+ private static boolean initialized = false;
+ private static boolean isObfuscated = true;
+
+ /**
+ * Called before mods are loaded.
+ * <p><b>SHOULD NOT BE CALLED!</b></p>
+ */
+ public static void preLaunch() {
+ if (preLaunched) return;
+ try {
+ Class.forName("net.minecraft.world.World");
+ LOGGER.warn("OneConfig is NOT obfuscated!");
+ isObfuscated = false;
+ } catch (Exception ignored) {
+ }
+ oneConfigDir.mkdirs();
+ new File(oneConfigDir, "profiles").mkdirs();
+ if (OneConfigConfig.getInstance() == null) {
+ OneConfigConfig.getInstance();
+ }
+ if (Preferences.getInstance() == null) {
+ Preferences.getInstance();
+ }
+ preLaunched = true;
+ }
+
+ /**
+ * Called after mods are loaded.
+ * <p><b>SHOULD NOT BE CALLED!</b></p>
+ */
+ @SuppressWarnings("ResultOfMethodCallIgnored")
+ public static void init() {
+ if (initialized) return;
+ GuiUtils.getDeltaTime(); // called to make sure static initializer is called
+ try {
+ EventManager.INSTANCE.register(BlurHandler.INSTANCE);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ CommandManager.INSTANCE.registerCommand(OneConfigCommand.class);
+ EventManager.INSTANCE.register(new HudCore());
+ HypixelUtils.INSTANCE.initialize();
+ EventManager.INSTANCE.register(KeyBindHandler.INSTANCE);
+ ConfigCore.sortMods();
+
+ initialized = true;
+ }
+
+ /** Returns weather this is an obfuscated environment, using a check for obfuscated name of net.minecraft.world.World.class.
+ * @return true if this is an obfuscated environment, which is normal for Minecraft or false if not. */
+ public static boolean isObfuscated() {
+ return isObfuscated;
+ }
+
+ @Subscribe
+ private void onShutdown(ShutdownEvent event) {
+ ConfigCore.saveAll();
+ }
+}
diff --git a/versions/src/main/java/cc/polyfrost/oneconfig/internal/gui/impl/BlurHandlerImpl.java b/versions/src/main/java/cc/polyfrost/oneconfig/internal/gui/impl/BlurHandlerImpl.java
new file mode 100644
index 0000000..0ef5f2b
--- /dev/null
+++ b/versions/src/main/java/cc/polyfrost/oneconfig/internal/gui/impl/BlurHandlerImpl.java
@@ -0,0 +1,132 @@
+package cc.polyfrost.oneconfig.internal.gui.impl;
+
+import cc.polyfrost.oneconfig.events.event.RenderEvent;
+import cc.polyfrost.oneconfig.events.event.ScreenOpenEvent;
+import cc.polyfrost.oneconfig.events.event.Stage;
+import cc.polyfrost.oneconfig.gui.OneConfigGui;
+import cc.polyfrost.oneconfig.internal.config.Preferences;
+import cc.polyfrost.oneconfig.internal.gui.BlurHandler;
+import cc.polyfrost.oneconfig.internal.mixin.ShaderGroupAccessor;
+import cc.polyfrost.oneconfig.libs.eventbus.Subscribe;
+import cc.polyfrost.oneconfig.libs.universal.UMinecraft;
+import cc.polyfrost.oneconfig.libs.universal.UScreen;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.shader.Shader;
+import net.minecraft.client.shader.ShaderUniform;
+import net.minecraft.util.ResourceLocation;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+
+/**
+ * An implementation of the BlurMC mod by tterrag1098.
+ * <p>
+ * For the original source see <a href="https://github.com/tterrag1098/Blur/blob/1.8.9/src/main/java/com/tterrag/blur/Blur.java">...</a>
+ * For the public license, see <a href="https://github.com/tterrag1098/Blur/blob/1.8.9/LICENSE">...</a>
+ * <p>
+ * License available under <a href="https://github.com/boomboompower/ToggleChat/blob/master/src/main/resources/licenses/BlurMC-License.txt">...</a>
+ *
+ * @author tterrag1098, boomboompower
+ * <p>
+ * Taken from ToggleChat
+ * <a href="https://github.com/boomboompower/ToggleChat/blob/master/LICENSE">...</a>
+ */
+public class BlurHandlerImpl implements BlurHandler {
+ private final ResourceLocation blurShader = new ResourceLocation("shaders/post/fade_in_blur.json");