From 0eed1696ca6a8356fc3b1aeb4219464cbdf62df0 Mon Sep 17 00:00:00 2001 From: Desoroxxx Date: Tue, 19 Sep 2023 19:09:46 +0200 Subject: [PATCH] Rebrand & Cleanup --- build.gradle | 141 ++++++++---------- .../java/dev/redstudio/redcore/RedCore.java | 100 ++++++++----- .../redstudio/redcore/asm/RedCorePlugin.java | 41 ----- .../redcore/ticking/RedClientTicker.java | 19 +++ .../redstudio/redcore/utils/OptiNotFine.java | 14 ++ src/main/resources/logo.png | Bin 0 -> 24077 bytes src/main/resources/mcmod.info | 11 -- 7 files changed, 155 insertions(+), 171 deletions(-) delete mode 100644 src/main/java/dev/redstudio/redcore/asm/RedCorePlugin.java create mode 100644 src/main/resources/logo.png delete mode 100644 src/main/resources/mcmod.info diff --git a/build.gradle b/build.gradle index 8946e50..68d7384 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,16 @@ import org.jetbrains.gradle.ext.Gradle plugins { - id("java") - id("java-library") - id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" - id("com.gtnewhorizons.retrofuturagradle") version "1.+" - id("com.matthewprenger.cursegradle") version "1.4.0" - id("io.freefair.lombok") version "8.3" + id 'java' + id 'java-library' + id 'io.freefair.lombok' version '8.+' + id 'com.github.gmazzo.buildconfig' version '4.+' + id 'com.gtnewhorizons.retrofuturagradle' version '1.+' + id 'org.jetbrains.gradle.plugin.idea-ext' version '1.+' } // Add version to the jar name -version project.version +version = project.version // Set the toolchain version to decouple the Java we run Gradle with from the Java used to compile and run the mod java { @@ -23,111 +23,90 @@ java { } tasks.withType(JavaCompile).configureEach { - options.encoding = "UTF-8" + options.encoding = 'UTF-8' options.fork = true } minecraft { - mcVersion = "1.12.2" - - username = "Desoroxxx" - - extraRunJvmArguments.addAll("-Xmx6G", "-Xms4G", "-Dforge.logging.console.level=debug", "-Dfml.coreMods.load=io.redstudioragnarok.redcore.asm.RedCorePlugin") - - injectedTags.put("ID", project.id) - injectedTags.put("VERSION", project.version) -} - -// Generate a my.project.Tags class with the version number as a field -tasks.injectTags.configure { - outputClassName.set("io.redstudioragnarok.${project.id}.Tags") + mcVersion = '1.12.2' + username = 'Desoroxxx' + extraRunJvmArguments.addAll('-Xmx6G', '-Xms4G', '-Dforge.logging.console.level=debug', '-Dfml.coreMods.load=dev.redstudio.redcore.RedCore') } -// Create configuration to include embedded dependencies into the jar configurations { implementation compile.extendsFrom(embed) } dependencies { - implementation "net.jafama:jafama:2.3.2" - embed "net.jafama:jafama:2.3.2" + implementation 'net.jafama:jafama:2.3.2' + embed 'net.jafama:jafama:2.3.2' } -processResources { - inputs.property "id", project.id - inputs.property "version", project.version - filesMatching("mcmod.info") { fcd -> - include "mcmod.info" - fcd.expand ( - "id": project.id, - "version": project.version - ) - } - dependsOn "compileJava" +buildConfig { + buildConfigField("String", "ID", "\"${project.id}\"") + buildConfigField("String", "VERSION", "\"${project.version}\"") } jar { manifest.attributes([ - "ModSide": "BOTH", - "FMLCorePlugin": "io.redstudioragnarok.redcore.asm.RedCorePlugin", - "FMLCorePluginContainsFMLMod": true, - "ForceLoadAsMod": true + 'ModSide': 'BOTH', + 'FMLCorePlugin': 'dev.redstudio.redcore.RedCore', + 'FMLCorePluginContainsFMLMod': true, + 'ForceLoadAsMod': true ]) - // Add all embedded dependencies into the jar - from(provider{ configurations.embed.collect {it.isDirectory() ? it : zipTree(it)} }) - - // Add ! to the name of the jar to make sure we get loaded first - jar.archiveBaseName.set("!Red-Core") + from(provider { configurations.embed.collect { it.isDirectory() ? it : zipTree(it) } }) + archiveBaseName.set('!Red-Core') } idea { module { inheritOutputDirs = true excludeDirs = [ - file(".settings"), - file(".github"), - file(".gradle"), - file("gradle"), - file(".idea"), - file("build"), - file("run"), - file("bin") + file('.settings'), + file('.github'), + file('.gradle'), + file('gradle'), + file('.idea'), + file('build'), + file('run'), + file('bin') ] } - project { settings { - runConfigurations { - "Client"(Gradle) { - taskNames = ["runClient"] - } - "Server"(Gradle) { - taskNames = ["runServer"] + project { + jdkName = '1.8' + languageLevel = '1.8' + + settings { + runConfigurations { + 'Client'(Gradle) { + taskNames = ['runClient'] + } + 'Server'(Gradle) { + taskNames = ['runServer'] + } + 'Obfuscated Client'(Gradle) { + taskNames = ['runObfClient'] + } + 'Obfuscated Server'(Gradle) { + taskNames = ['runObfServer'] + } + 'Vanilla Client'(Gradle) { + taskNames = ['runVanillaClient'] + } + 'Vanilla Server'(Gradle) { + taskNames = ['runVanillaServer'] + } } - "Obfuscated Client"(Gradle) { - taskNames = ["runObfClient"] - } - "Obfuscated Server"(Gradle) { - taskNames = ["runObfServer"] - } - "Vanilla Client"(Gradle) { - taskNames = ["runVanillaClient"] - } - "Vanilla Server"(Gradle) { - taskNames = ["runVanillaServer"] - } - } - compiler.javac { - afterEvaluate { - javacAdditionalOptions = "-encoding utf8" - moduleJavacAdditionalOptions = [ (project.id + ".main"): tasks.compileJava.options.compilerArgs.collect { """ + it + """ }.join(" ") ] + compiler.javac { + afterEvaluate { + javacAdditionalOptions = '-encoding utf8' + moduleJavacAdditionalOptions = [(project.id + '.main'): tasks.compileJava.options.compilerArgs.collect { " $it " }.join(' ')] + } } } - }} -} - -tasks.named("processIdeaSettings").configure { - dependsOn("injectTags") + } } diff --git a/src/main/java/dev/redstudio/redcore/RedCore.java b/src/main/java/dev/redstudio/redcore/RedCore.java index 51d3245..30ef22d 100644 --- a/src/main/java/dev/redstudio/redcore/RedCore.java +++ b/src/main/java/dev/redstudio/redcore/RedCore.java @@ -1,13 +1,17 @@ package dev.redstudio.redcore; -import dev.redstudio.redcore.ticking.RedClientTickEvent; -import dev.redstudio.redcore.ticking.RedClientTicker; -import dev.redstudio.redcore.utils.ModReference; -import dev.redstudio.redcore.utils.OptiNotFine; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import com.google.common.eventbus.EventBus; +import net.minecraftforge.fml.common.DummyModContainer; +import net.minecraftforge.fml.common.LoadController; +import net.minecraftforge.fml.common.ModMetadata; +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; + +import javax.annotation.Nullable; +import java.util.Map; + +import static dev.redstudio.redcore.utils.ModReference.ID; +import static dev.redstudio.redcore.utils.ModReference.NAME; +import static dev.redstudio.redcore.utils.ModReference.VERSION; // /$$$$$$$ /$$ /$$$$$$ // | $$__ $$ | $$ /$$__ $$ @@ -17,39 +21,59 @@ // | $$ \ $$| $$_____/| $$ | $$ | $$ $$| $$ | $$| $$ | $$_____/ // | $$ | $$| $$$$$$$| $$$$$$$ | $$$$$$/| $$$$$$/| $$ | $$$$$$$ // |__/ |__/ \_______/ \_______/ \______/ \______/ |__/ \_______/ -@Mod(modid = ModReference.ID, name = ModReference.NAME, version = ModReference.VERSION, updateJSON = "https://raw.githubusercontent.com/Red-Studio-Ragnarok/Red-Core/main/update.json") -public final class RedCore { - - private static boolean clientTickerStarted = false; - private static boolean forceOptiFineFastRenderOff = false; - - /** - * Starts the client ticker. - *

- * This method registers {@link RedClientTicker} in the {@link MinecraftForge} event bus if the client ticker has not already been started. - *

- * The client ticker is responsible for ticking and thus sending the {@link RedClientTickEvent}. - * - * @author Desoroxxx - * @since 0.3 - */ - @SideOnly(Side.CLIENT) - public static void startClientTicker() { - if (clientTickerStarted) - return; - - MinecraftForge.EVENT_BUS.register(RedClientTicker.class); - clientTickerStarted = true; +@IFMLLoadingPlugin.Name(NAME) +@IFMLLoadingPlugin.MCVersion("1.12.2") +@IFMLLoadingPlugin.SortingIndex(Integer.MIN_VALUE + 2) +public final class RedCore implements IFMLLoadingPlugin { + + @Override + public String[] getASMTransformerClass() { + return new String[0]; + } + + @Override + public String getModContainerClass() { + return "dev.redstudio.redcore.RedCore$Container"; + } + + @Nullable + @Override + public String getSetupClass() { + return null; } - @SideOnly(Side.CLIENT) - public static void forceOptiFineFastRenderOff() { - if (forceOptiFineFastRenderOff) - return; + @Override + public void injectData(final Map data) { + + } + + @Override + public String getAccessTransformerClass() { + return null; + } + + public static class Container extends DummyModContainer { + + public Container() { + super(new ModMetadata()); + + final ModMetadata modMetadata = this.getMetadata(); - startClientTicker(); + modMetadata.modId = ID; + modMetadata.name = "Red Core"; + modMetadata.description = "§lRed-Core§r\n\nRed-Core is the foundational framework for Red Studio projects and associated projects. It features robust development utilities, streamlined error logging, and a high-speed, clean vectors' suite.\n\n§lFeatures§r\n\n- §lRedLogger:§r This robust error logger elevates error tracking, offering a clean, user-friendly experience that demystifies complex error data.\n- §lVectors:§r Introducing a comprehensive vector suite that is sleek and speedy, continuously evolving with new features as per necessity.\n- §lMathUtil:§r A purpose-built class providing an array of mathematical methods, engineered with a steadfast focus on rapid processing and calculations.\n- §lStopwatch:§r Tailored for precise profiling, this stopwatch sets itself apart in the burgeoning roster of Java-based stopwatch solutions, by its simplicity and easy of use.\n- §lRedClientTicker:§r A useful ticker that allows you to have ticks every 2, 5 or 10 normal ticks, for things that shouldn't run 20 times a second.\n- §lOptiNotFine:§r A must-have when working with OptiFine compatibility, it allows you to know if OptiFine is installed, whether shaders are loaded, and to force fast render off.\n- §lNetworkUtil:§r Designed to streamline network coding practices, this utility makes writing cleaner, safer, and more efficient networking code effortless.\n- §lJafama:§r Red Core embeds Jafama allowing you to use it in your mods\n\n§lWhy Red-Core?§r\n\nRed-Core sits at the heart of Red Studio's Minecraft 1.12 mods, aiming to make your mod development process more efficient. By providing a set of tailored tools and libraries, we allow you to focus more on designing exciting mods and less on the intricacies of development.\n\nWhat sets us apart is our comprehensive Javadoc documentation. We believe good documentation is the cornerstone of effective development. Every method in Red-Core comes with detailed Javadoc comments, making the technical information and guidance you need just a ctrl-click away.\n\nJoin us in enhancing Red-Core! We believe in constant evolution and the power of community-driven development. Whether you're a contributor or a user in the Minecraft modding community, your experience matters. We're here to ensure it's the best it can be."; + modMetadata.url = "https://www.curseforge.com/minecraft/mc-mods/red-core"; + modMetadata.updateJSON = "https://raw.githubusercontent.com/Red-Studio-Ragnarok/Red-Core/main/update.json"; + modMetadata.logoFile = "/logo.png"; + modMetadata.version = VERSION; + modMetadata.authorList.add("Red Studio"); + modMetadata.credits = "Desoroxxx"; + } - MinecraftForge.EVENT_BUS.register(OptiNotFine.class); - forceOptiFineFastRenderOff = true; + @Override + public boolean registerBus(final EventBus eventBus, final LoadController loadController) { + eventBus.register(this); + return true; + } } } diff --git a/src/main/java/dev/redstudio/redcore/asm/RedCorePlugin.java b/src/main/java/dev/redstudio/redcore/asm/RedCorePlugin.java deleted file mode 100644 index 46a1a58..0000000 --- a/src/main/java/dev/redstudio/redcore/asm/RedCorePlugin.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.redstudio.redcore.asm; - -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; - -import javax.annotation.Nullable; -import java.util.Map; - -import static dev.redstudio.redcore.utils.ModReference.NAME; - -@IFMLLoadingPlugin.Name(NAME) -@IFMLLoadingPlugin.MCVersion("1.12.2") -@IFMLLoadingPlugin.SortingIndex(Integer.MIN_VALUE + 2) -@IFMLLoadingPlugin.TransformerExclusions("io.redstudioragnarok.redcore.asm") -public final class RedCorePlugin implements IFMLLoadingPlugin { - - @Override - public String[] getASMTransformerClass() { - return new String[0]; - } - - @Override - public String getModContainerClass() { - return null; - } - - @Nullable - @Override - public String getSetupClass() { - return null; - } - - @Override - public void injectData(final Map data) { - - } - - @Override - public String getAccessTransformerClass() { - return null; - } -} diff --git a/src/main/java/dev/redstudio/redcore/ticking/RedClientTicker.java b/src/main/java/dev/redstudio/redcore/ticking/RedClientTicker.java index 6d17c3e..62d4249 100644 --- a/src/main/java/dev/redstudio/redcore/ticking/RedClientTicker.java +++ b/src/main/java/dev/redstudio/redcore/ticking/RedClientTicker.java @@ -16,6 +16,8 @@ @SideOnly(Side.CLIENT) public class RedClientTicker { + private static boolean clientTickerStarted = false; + private static int biTickCount, pentaTickCount, decaTickCount; @SubscribeEvent(priority = EventPriority.HIGHEST) @@ -41,4 +43,21 @@ public static void onClientTickEvent(TickEvent.ClientTickEvent clientTickEvent) } } } + + /** + * Starts the client ticker. + *

+ * This method registers {@link RedClientTicker} in the {@link MinecraftForge} event bus if the client ticker has not already been started. + *

+ * The client ticker is responsible for ticking and thus sending the {@link RedClientTickEvent}. + *

+ * For performance reasons, this should be called on any of the init methods in your mod. + * + * @author Desoroxxx + * @since 0.3 + */ + @SideOnly(Side.CLIENT) + public static void startClientTicker() { + MinecraftForge.EVENT_BUS.register(RedClientTicker.class); + } } diff --git a/src/main/java/dev/redstudio/redcore/utils/OptiNotFine.java b/src/main/java/dev/redstudio/redcore/utils/OptiNotFine.java index 50b42dc..8ceae6c 100644 --- a/src/main/java/dev/redstudio/redcore/utils/OptiNotFine.java +++ b/src/main/java/dev/redstudio/redcore/utils/OptiNotFine.java @@ -1,6 +1,8 @@ package dev.redstudio.redcore.utils; +import dev.redstudio.redcore.ticking.RedClientTicker; import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.relauncher.Side; @@ -64,9 +66,21 @@ public static boolean shadersEnabled() { } } + /** + * Forces OptiFine fast render option to be disabled. + *

+ * This method starts the client ticker and registers the OptiNotFine class as an event listener which will attempt to disable OptiFine's fast render each tick. + */ + public static void forceOptiFineFastRenderOff() { + RedClientTicker.startClientTicker(); + + MinecraftForge.EVENT_BUS.register(OptiNotFine.class); + } + /** * Disable OptiFine fast renderer. */ + @SuppressWarnings("JavaReflectionMemberAccess") private static void disableFastRender() { if (!isOptiFineInstalled()) return; diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..44d9e429eab0a7da48efd55dfa2fcddf03f0713a GIT binary patch literal 24077 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 HzbE|{Sw6uZ literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index fb52716..0000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "modid": "${id}", - "name": "Red Core", - "description": "§lRed-Core§r\n\nRed-Core is the foundational framework for Red Studio projects and associated projects. It features robust development utilities, streamlined error logging, and a high-speed, clean vectors' suite.\n\n§lFeatures§r\n\n- §lRedLogger:§r This robust error logger elevates error tracking, offering a clean, user-friendly experience that demystifies complex error data.\n- §lVectors:§r Introducing a comprehensive vector suite that is sleek and speedy, continuously evolving with new features as per necessity.\n- §lMathUtil:§r A purpose-built class providing an array of mathematical methods, engineered with a steadfast focus on rapid processing and calculations.\n- §lStopwatch:§r Tailored for precise profiling, this stopwatch sets itself apart in the burgeoning roster of Java-based stopwatch solutions, by its simplicity and easy of use.\n- §lRedClientTicker:§r A useful ticker that allows you to have ticks every 2, 5 or 10 normal ticks, for things that shouldn't run 20 times a second.\n- §lOptiNotFine:§r A must-have when working with OptiFine compatibility, it allows you to know if OptiFine is installed, whether shaders are loaded, and to force fast render off.\n- §lNetworkUtil:§r Designed to streamline network coding practices, this utility makes writing cleaner, safer, and more efficient networking code effortless.\n- §lJafama:§r Red Core embeds Jafama allowing you to use it in your mods\n\n§lWhy Red-Core?§r\n\nRed-Core sits at the heart of Red Studio's Minecraft 1.12 mods, aiming to make your mod development process more efficient. By providing a set of tailored tools and libraries, we allow you to focus more on designing exciting mods and less on the intricacies of development.\n\nWhat sets us apart is our comprehensive Javadoc documentation. We believe good documentation is the cornerstone of effective development. Every method in Red-Core comes with detailed Javadoc comments, making the technical information and guidance you need just a ctrl-click away.\n\nJoin us in enhancing Red-Core! We believe in constant evolution and the power of community-driven development. Whether you're a contributor or a user in the Minecraft modding community, your experience matters. We're here to ensure it's the best it can be.", - "version": "${version}", - "url": "https://www.curseforge.com/minecraft/mc-mods/red-core", - "authorList": ["Red Studio"], - "credits": "Desoroxxx" - } -]