···11+# Changelog
22+33+All notable changes to this project will be documented in this file.
44+55+The format is based on [Keep a Changelog](https://keepachangelog.com),
66+and this project follows the [Ragnarök Versioning Convention](https://github.com/Red-Studio-Ragnarok/Commons/blob/main/Ragnar%C3%B6k%20Versioning%20Convention.md).
77+88+## OptiNotFine Version 1.0 Changelog - 2026-01-09
99+1010+Initial Release
+21
LICENSE
···11+MIT License
22+33+Copyright (c) 2025 Luna Mira Lage (Desoroxxx)
44+55+Permission is hereby granted, free of charge, to any person obtaining a copy
66+of this software and associated documentation files (the "Software"), to deal
77+in the Software without restriction, including without limitation the rights
88+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
99+copies of the Software, and to permit persons to whom the Software is
1010+furnished to do so, subject to the following conditions:
1111+1212+The above copyright notice and this permission notice shall be included in all
1313+copies or substantial portions of the Software.
1414+1515+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1616+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1717+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1818+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1919+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2020+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121+SOFTWARE.
+59
README.md
···11+[](https://www.curseforge.com/minecraft/mc-mods/optinotfine)
22+[](https://modrinth.com/mod/optinotfine)
33+44+[](https://www.buymeacoffee.com/desoroxxx)
55+[](https://discord.gg/hKpUYx7VwS)
66+77+[](https://adoptium.net/temurin/releases/?version=8)
88+[](https://gradle.org/)
99+[](http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.12.2.html)
1010+1111+# OptiNotFine
1212+1313+Fixing OptiFine, until something better comes.
1414+1515+## Features
1616+1717+- **Stop Log Spam**
1818+ - This removes some logging calls that OptiFine will spam over and over again, here’s a list of them:
1919+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Ambiguous shader option: {}`
2020+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Unknown macro value: {}`
2121+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Shaders: Item not found: {}`
2222+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Shaders: Block not found for name: {}`
2323+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Shaders: Invalid item ID mapping: {}`
2424+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Shaders: Invalid block ID mapping: {}`
2525+ - `[HH:MM:SS] [Client thread/WARN] [Config]: [OptiFine] Shaders: Invalid entity ID mapping: {}`
2626+ - `[HH:MM:SS] [Client thread/INFO] [net.optifine.shaders.SMCLog]: {}`
2727+2828+## Fixes
2929+3030+- **Fix missing methods**
3131+ - Currently, OptiNotFine re-adds missing methods that OptiFine accidentally removes; here’s a list of them:
3232+ - `net.minecraft.client.resources.AbstractResourcePack#getResourcePackFile()`
3333+- **Fix broken F3 native memory usage display on Java 17+**
3434+ - In Java 17+ the classes OptiFine tries to use to display native memory usage have been moved to a different package, OptiNotFine fixes this by adding the new locations to the list of classes to use.
3535+3636+## FAQ
3737+3838+- What happens if OptiFine isn’t present?
3939+ - Nothing, this can be safely included in any modpack.
4040+- This doesn't fix X?
4141+ - If you have found an issue with OptiFine, create an issue.
4242+4343+---
4444+4545+[](https://bisecthosting.com/Desoroxxx?r=OptiNotFine+Tangled)
4646+4747+# Want to have your own mod or support me?
4848+4949+If you're looking for a mod but don't have the development skills or time, consider commissioning me!
5050+My commissions are currently open, and I’d be happy to create a custom mod to fit your needs as long as you provide assets.
5151+5252+[Commissions](https://www.buymeacoffee.com/desoroxxx/commissions)
5353+5454+You can also support me on a monthly basis by becoming a member.
5555+To thank you, you’ll have the possibility to access exclusive post and messages, Discord channel for WIP content, and even access to unreleased Prototypes or WIP Projects.
5656+5757+[Membership](https://www.buymeacoffee.com/desoroxxx/membership)
5858+5959+You can also [buy me a hot chocolate](https://www.buymeacoffee.com/desoroxxx).
+178
build.gradle.kts
···11+import org.gradle.plugins.ide.idea.model.IdeaLanguageLevel
22+import org.jetbrains.gradle.ext.runConfigurations
33+import org.jetbrains.gradle.ext.settings
44+55+plugins {
66+ id("org.jetbrains.gradle.plugin.idea-ext") version "1.3"
77+ id("com.gtnewhorizons.retrofuturagradle") version "2.0.2"
88+ id("com.github.gmazzo.buildconfig") version "6.0.7"
99+ id("io.freefair.lombok") version "9.1.0"
1010+}
1111+1212+group = "dev.redstudio"
1313+version = "1.0" // Versioning must follow Ragnarök versioning convention: https://github.com/Red-Studio-Ragnarok/Commons/blob/main/Ragnar%C3%B6k%20Versioning%20Convention.md
1414+1515+val id = project.name.lowercase()
1616+val plugin = "${project.group}.${id}.asm.${project.name}Plugin"
1717+1818+val jvmCommonArgs = "-Dfile.encoding=UTF-8 -XX:+UseStringDeduplication"
1919+2020+val redCoreVersion = "0.7"
2121+2222+val configAnytimeVersion = "3.0"
2323+2424+minecraft {
2525+ mcVersion = "1.12.2"
2626+ username = "Desoroxxx"
2727+ extraRunJvmArguments = listOf("-Dforge.logging.console.level=debug", "-Dfml.coreMods.load=${plugin}") + jvmCommonArgs.split(" ")
2828+}
2929+3030+repositories {
3131+ arrayOf("Release", "Beta", "Dev").forEach { repoType ->
3232+ maven {
3333+ name = "Red Studio - $repoType"
3434+ url = uri("https://repo.redstudio.dev/${repoType.lowercase()}")
3535+ content {
3636+ includeGroup("dev.redstudio")
3737+ }
3838+ }
3939+ }
4040+4141+ maven {
4242+ name = "Cleanroom"
4343+ url = uri("https://maven.cleanroommc.com")
4444+ content {
4545+ includeGroup("com.cleanroommc")
4646+ }
4747+ }
4848+4949+ mavenCentral()
5050+ mavenLocal()
5151+}
5252+5353+dependencies {
5454+ implementation("dev.redstudio:Red-Core-MC:1.8-1.12-$redCoreVersion")
5555+5656+ implementation("com.cleanroommc:configanytime:$configAnytimeVersion")
5757+}
5858+5959+buildConfig {
6060+ packageName("${project.group}.${id}")
6161+ className("ProjectConstants")
6262+ documentation.set("This class defines constants for ${project.name}.\n<p>\nThey are automatically updated by Gradle.")
6363+ useJavaOutput()
6464+6565+ // Details
6666+ buildConfigField("ID",id)
6767+ buildConfigField("NAME", project.name)
6868+ buildConfigField("VERSION", project.version.toString())
6969+7070+ // Versions
7171+ buildConfigField("RED_CORE_VERSION", redCoreVersion)
7272+ buildConfigField("CONFIG_ANYTIME_VERSION", configAnytimeVersion)
7373+7474+ // Loggers
7575+ buildConfigField("org.apache.logging.log4j.Logger", "LOGGER", "org.apache.logging.log4j.LogManager.getLogger(NAME)")
7676+ buildConfigField("dev.redstudio.redcore.logging.RedLogger", "RED_LOGGER", """new RedLogger(NAME, "https://tangled.org/desoroxxx.redstudio.dev/${project.name}/issues/new", LOGGER)""")
7777+}
7878+7979+// Set the toolchain version to decouple the Java we run Gradle with from the Java used to compile and run the mod
8080+java {
8181+ toolchain {
8282+ languageVersion.set(JavaLanguageVersion.of(8))
8383+ vendor.set(JvmVendorSpec.ADOPTIUM)
8484+ }
8585+ if (!project.version.toString().contains("Dev"))
8686+ withSourcesJar() // Generate sources jar, for releases
8787+}
8888+8989+tasks {
9090+ processResources {
9191+ val expandProperties = mapOf(
9292+ "version" to project.version,
9393+ "name" to project.name,
9494+ "id" to id
9595+ )
9696+9797+ inputs.properties(expandProperties)
9898+9999+ filesMatching("**/*.*") {
100100+ val exclusions = arrayOf(".png")
101101+ if (!exclusions.any { path.endsWith(it) })
102102+ expand(expandProperties)
103103+ }
104104+ }
105105+106106+ val processReadme by registering {
107107+ val input = rootProject.file("README.md")
108108+ val output = layout.buildDirectory.file("processed-readme/README.md")
109109+110110+ inputs.file(input)
111111+ outputs.file(output)
112112+113113+ doLast {
114114+ val content = input.readText()
115115+ val firstHash = content.indexOf('#')
116116+ val lastSeparator = content.lastIndexOf("---")
117117+118118+ val trimmed = when {
119119+ firstHash != -1 && lastSeparator > firstHash -> content.substring(firstHash, lastSeparator)
120120+ firstHash != -1 -> content.substring(firstHash)
121121+ else -> content
122122+ }
123123+124124+ output.get().asFile.parentFile.mkdirs()
125125+ output.get().asFile.writeText(trimmed.trim())
126126+ }
127127+ }
128128+129129+ withType<Jar> {
130130+ dependsOn(processReadme)
131131+ from(processReadme.map { it.outputs.files })
132132+ from(rootProject.file("LICENSE"))
133133+ from(rootProject.file("CHANGELOG.md"))
134134+135135+ manifest {
136136+ attributes(
137137+ "ModSide" to "CLIENT",
138138+ "FMLCorePlugin" to plugin,
139139+ "FMLCorePluginContainsFMLMod" to "true",
140140+ "ForceLoadAsMod" to "true"
141141+ )
142142+ }
143143+ }
144144+145145+ withType<JavaCompile>{
146146+ options.encoding = "UTF-8"
147147+148148+ options.isFork = true
149149+ options.forkOptions.jvmArgs = jvmCommonArgs.split(" ")
150150+ }
151151+}
152152+153153+idea {
154154+ module {
155155+ inheritOutputDirs = true
156156+ excludeDirs.addAll(setOf(".gradle", ".idea", "build", "gradle", "run", "gradlew", "gradlew.bat", "desktop.ini").map(::file))
157157+ }
158158+159159+ project {
160160+ settings {
161161+ jdkName = "1.8"
162162+ languageLevel = IdeaLanguageLevel("JDK_1_8")
163163+164164+165165+ runConfigurations {
166166+ listOf("Client", "Server", "Obfuscated Client", "Obfuscated Server", "Vanilla Client", "Vanilla Server").forEach { name ->
167167+ create(name, org.jetbrains.gradle.ext.Gradle::class.java) {
168168+ val prefix = name.substringBefore(" ").let { if (it == "Obfuscated") "Obf" else it }
169169+ val suffix = name.substringAfter(" ").takeIf { it != prefix } ?: ""
170170+ taskNames = setOf("run$prefix$suffix")
171171+172172+ jvmArgs = jvmCommonArgs
173173+ }
174174+ }
175175+ }
176176+ }
177177+ }
178178+}
···11+@rem
22+@rem Copyright 2015 the original author or authors.
33+@rem
44+@rem Licensed under the Apache License, Version 2.0 (the "License");
55+@rem you may not use this file except in compliance with the License.
66+@rem You may obtain a copy of the License at
77+@rem
88+@rem https://www.apache.org/licenses/LICENSE-2.0
99+@rem
1010+@rem Unless required by applicable law or agreed to in writing, software
1111+@rem distributed under the License is distributed on an "AS IS" BASIS,
1212+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313+@rem See the License for the specific language governing permissions and
1414+@rem limitations under the License.
1515+@rem
1616+@rem SPDX-License-Identifier: Apache-2.0
1717+@rem
1818+1919+@if "%DEBUG%"=="" @echo off
2020+@rem ##########################################################################
2121+@rem
2222+@rem Gradle startup script for Windows
2323+@rem
2424+@rem ##########################################################################
2525+2626+@rem Set local scope for the variables with windows NT shell
2727+if "%OS%"=="Windows_NT" setlocal
2828+2929+set DIRNAME=%~dp0
3030+if "%DIRNAME%"=="" set DIRNAME=.
3131+@rem This is normally unused
3232+set APP_BASE_NAME=%~n0
3333+set APP_HOME=%DIRNAME%
3434+3535+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
3636+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
3737+3838+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
3939+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
4040+4141+@rem Find java.exe
4242+if defined JAVA_HOME goto findJavaFromJavaHome
4343+4444+set JAVA_EXE=java.exe
4545+%JAVA_EXE% -version >NUL 2>&1
4646+if %ERRORLEVEL% equ 0 goto execute
4747+4848+echo. 1>&2
4949+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
5050+echo. 1>&2
5151+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
5252+echo location of your Java installation. 1>&2
5353+5454+goto fail
5555+5656+:findJavaFromJavaHome
5757+set JAVA_HOME=%JAVA_HOME:"=%
5858+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
5959+6060+if exist "%JAVA_EXE%" goto execute
6161+6262+echo. 1>&2
6363+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
6464+echo. 1>&2
6565+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
6666+echo location of your Java installation. 1>&2
6767+6868+goto fail
6969+7070+:execute
7171+@rem Setup the command line
7272+7373+7474+7575+@rem Execute Gradle
7676+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
7777+7878+:end
7979+@rem End local scope for the variables with windows NT shell
8080+if %ERRORLEVEL% equ 0 goto mainEnd
8181+8282+:fail
8383+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
8484+rem the _cmd.exe /c_ return code!
8585+set EXIT_CODE=%ERRORLEVEL%
8686+if %EXIT_CODE% equ 0 set EXIT_CODE=1
8787+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
8888+exit /b %EXIT_CODE%
8989+9090+:mainEnd
9191+if "%OS%"=="Windows_NT" endlocal
9292+9393+:omega
···11+package dev.redstudio.optinotfine.config;
22+33+import com.cleanroommc.configanytime.ConfigAnytime;
44+import net.minecraftforge.common.config.Config;
55+import net.minecraftforge.common.config.ConfigManager;
66+import net.minecraftforge.fml.client.event.ConfigChangedEvent;
77+import net.minecraftforge.fml.common.Mod;
88+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
99+1010+import static dev.redstudio.optinotfine.ProjectConstants.*;
1111+1212+/// @author Luna Mira Lage (Desoroxxx)
1313+/// @since 1.0
1414+@Config(modid = ID, name = NAME)
1515+@Mod.EventBusSubscriber(modid = ID)
1616+public final class OptiNotFineConfig {
1717+1818+ @Config.RequiresMcRestart
1919+ @Config.Name("Stop Log Spam")
2020+ @Config.Comment("Stop what is considered log spam but may still be useful when working with OptiFine features (Shaders, Resourcepacks, etc...), see README.md for a list.")
2121+ public static boolean stopLogSpam = true;
2222+2323+ @SubscribeEvent
2424+ public static void onConfigChanged(final ConfigChangedEvent.OnConfigChangedEvent onConfigChangedEvent) {
2525+ if (!onConfigChangedEvent.getModID().equals(ID))
2626+ return;
2727+2828+ ConfigManager.sync(ID, Config.Type.INSTANCE);
2929+ }
3030+3131+ static {
3232+ ConfigAnytime.register(OptiNotFineConfig.class);
3333+ }
3434+}
src/main/resources/logo.png
This is a binary file and will not be displayed.
+16
src/main/resources/mcmod.info
···11+[
22+ {
33+ "name": "${name}",
44+ "modid": "${id}",
55+ "version": "${version}",
66+ "mcversion": "1.12.2",
77+ "description": "§l${name}§r\\n\\nFixing OptiFine, until something better comes.",
88+ "authorList": [
99+ "Luna Mira Lage (Desoroxxx)"
1010+ ],
1111+ "credits": "Luna Mira Lage (Desoroxxx), Romane Morgan Raven Tony Vitiello (Shuriken_n)",
1212+ "url": "https://tangled.org/desoroxxx.redstudio.dev/${name}",
1313+ "updateJSON": "https://forge.curseupdate.com/1409147/${id}",
1414+ "logoFile": "logo.png"
1515+ }
1616+]