diff --git a/build.gradle b/build.gradle index 629a4833e..e3e21c20f 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,9 @@ plugins { id 'com.github.ben-manes.versions' version '0.39.0' id 'org.javamodularity.moduleplugin' version '1.8.7' id 'net.neoforged.licenser' version '0.7.2' apply false - id 'net.neoforged.gradleutils' version '3.0.0-alpha.10' + id 'com.diffplug.spotless' version '6.22.0' apply false + id 'net.neoforged.gradleutils' version "${gradleutils_version}" + id 'net.neoforged.gradleutils.spotless' version "${gradleutils_version}" apply false } changelog { @@ -26,7 +28,9 @@ allprojects { apply plugin: 'com.github.ben-manes.versions' apply plugin: 'org.javamodularity.moduleplugin' apply plugin: 'net.neoforged.licenser' + apply plugin: 'com.diffplug.spotless' apply plugin: 'net.neoforged.gradleutils' + apply plugin: 'net.neoforged.gradleutils.spotless' gradleutils { setupSigning(signAllPublications: true) @@ -35,6 +39,8 @@ allprojects { group = 'net.neoforged.fancymodloader' version = rootProject.version + spotlessUtils.configure(spotless) + repositories { mavenCentral() diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ColourScheme.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ColourScheme.java index 7db45b788..cd7908a88 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ColourScheme.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ColourScheme.java @@ -27,13 +27,15 @@ public Colour foreground() { public record Colour(int red, int green, int blue) { public float redf() { - return ((float)red)/255f; + return ((float) red) / 255f; } + public float greenf() { - return ((float)green)/255f; + return ((float) green) / 255f; } + public float bluef() { - return ((float)blue)/255f; + return ((float) blue) / 255f; } public int packedint(int a) { diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/DisplayWindow.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/DisplayWindow.java index 224dd28f8..d2f77f372 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/DisplayWindow.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/DisplayWindow.java @@ -5,23 +5,9 @@ package net.neoforged.fml.earlydisplay; -import joptsimple.OptionParser; -import net.neoforged.fml.loading.FMLConfig; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.loading.ImmediateWindowHandler; -import net.neoforged.fml.loading.progress.StartupNotificationManager; -import net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider; -import org.jetbrains.annotations.Nullable; -import org.lwjgl.PointerBuffer; -import org.lwjgl.glfw.GLFWImage; -import org.lwjgl.glfw.GLFWVidMode; -import org.lwjgl.stb.STBImage; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; -import org.lwjgl.util.tinyfd.TinyFileDialogs; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL.createCapabilities; +import static org.lwjgl.opengl.GL32C.*; import java.awt.Desktop; import java.io.BufferedReader; @@ -40,7 +26,13 @@ import java.util.Objects; import java.util.Optional; import java.util.StringJoiner; -import java.util.concurrent.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -51,10 +43,23 @@ import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Collectors; - -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL.createCapabilities; -import static org.lwjgl.opengl.GL32C.*; +import joptsimple.OptionParser; +import net.neoforged.fml.loading.FMLConfig; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.fml.loading.ImmediateWindowHandler; +import net.neoforged.fml.loading.progress.StartupNotificationManager; +import net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider; +import org.jetbrains.annotations.Nullable; +import org.lwjgl.PointerBuffer; +import org.lwjgl.glfw.GLFWImage; +import org.lwjgl.glfw.GLFWVidMode; +import org.lwjgl.stb.STBImage; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.system.MemoryUtil; +import org.lwjgl.util.tinyfd.TinyFileDialogs; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The Loading Window that is opened Immediately after Forge starts. @@ -70,7 +75,7 @@ * Based on the prior ClientVisualization, with some personal touches. */ public class DisplayWindow implements ImmediateWindowProvider { - private static final int[][] GL_VERSIONS = new int[][] {{4,6}, {4,5}, {4,4}, {4,3}, {4,2}, {4,1}, {4,0}, {3,3}, {3,2}}; + private static final int[][] GL_VERSIONS = new int[][] { { 4, 6 }, { 4, 5 }, { 4, 4 }, { 4, 3 }, { 4, 2 }, { 4, 1 }, { 4, 0 }, { 3, 3 }, { 3, 2 } }; private static final Logger LOGGER = LoggerFactory.getLogger("EARLYDISPLAY"); private final AtomicBoolean animationTimerTrigger = new AtomicBoolean(true); @@ -102,12 +107,13 @@ public class DisplayWindow implements ImmediateWindowProvider { private boolean maximized; private String glVersion; private SimpleFont font; - private Runnable repaintTick = ()->{}; + private Runnable repaintTick = () -> {}; @Override public String name() { return "fmlearlywindow"; } + @Override public Runnable initialize(String[] arguments) { final OptionParser parser = new OptionParser(); @@ -127,7 +133,7 @@ public Runnable initialize(String[] arguments) { FMLConfig.updateConfig(FMLConfig.ConfigValue.EARLY_WINDOW_WIDTH, winWidth); FMLConfig.updateConfig(FMLConfig.ConfigValue.EARLY_WINDOW_HEIGHT, winHeight); fbScale = FMLConfig.getIntConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_FBSCALE); - if (System.getenv("FML_EARLY_WINDOW_DARK")!= null) { + if (System.getenv("FML_EARLY_WINDOW_DARK") != null) { this.colourScheme = ColourScheme.BLACK; } else { try { @@ -143,13 +149,14 @@ public Runnable initialize(String[] arguments) { this.maximized = parsed.has(maximizedopt) || FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_MAXIMIZED); var forgeVersion = parsed.valueOf(forgeversionopt); - StartupNotificationManager.modLoaderConsumer().ifPresent(c->c.accept("NeoForge loading "+ forgeVersion)); + StartupNotificationManager.modLoaderConsumer().ifPresent(c -> c.accept("NeoForge loading " + forgeVersion)); performanceInfo = new PerformanceInfo(); return start(parsed.valueOf(mcversionopt), forgeVersion); } private static final long MINFRAMETIME = TimeUnit.MILLISECONDS.toNanos(10); // This is the FPS cap on the window - note animation is capped at 20FPS via the tickTimer private long nextFrameTime = 0; + /** * The main render loop. * renderThread executes this. @@ -200,7 +207,7 @@ private void initRender(final @Nullable String mcVersion, final String forgeVers // Wait for one frame to be complete before swapping; enable vsync in other words. glfwSwapInterval(1); createCapabilities(); - LOGGER.info("GL info: "+ glGetString(GL_RENDERER) + " GL version " + glGetString(GL_VERSION) + ", " + glGetString(GL_VENDOR)); + LOGGER.info("GL info: " + glGetString(GL_RENDERER) + " GL version " + glGetString(GL_VERSION) + ", " + glGetString(GL_VENDOR)); elementShader = new ElementShader(); try { @@ -220,16 +227,14 @@ private void initRender(final @Nullable String mcVersion, final String forgeVers this.font = new SimpleFont("Monocraft.ttf", fbScale, 200000, 1 + RenderElement.INDEX_TEXTURE_OFFSET); } catch (Throwable t) { LOGGER.error("Crash during font initialization", t); - crashElegantly("An error occurred initializing a font for rendering. "+t.getMessage()); + crashElegantly("An error occurred initializing a font for rendering. " + t.getMessage()); } this.elements = new ArrayList<>(Arrays.asList( RenderElement.fox(font), RenderElement.logMessageOverlay(font), - RenderElement.forgeVersionOverlay(font, mcVersion+"-"+forgeVersion.split("-")[0]), + RenderElement.forgeVersionOverlay(font, mcVersion + "-" + forgeVersion.split("-")[0]), RenderElement.performanceBar(font), - RenderElement.progressBars(font) - )); - + RenderElement.progressBars(font))); var date = Calendar.getInstance(); if (FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_SQUIR) || (date.get(Calendar.MONTH) == Calendar.APRIL && date.get(Calendar.DAY_OF_MONTH) == 1)) @@ -241,7 +246,7 @@ private void initRender(final @Nullable String mcVersion, final String forgeVers this.windowTick = renderScheduler.scheduleAtFixedRate(this::renderThreadFunc, 50, 50, TimeUnit.MILLISECONDS); this.performanceTick = renderScheduler.scheduleAtFixedRate(performanceInfo::update, 0, 500, TimeUnit.MILLISECONDS); // schedule a 50 ms ticker to try and smooth out the rendering - renderScheduler.scheduleAtFixedRate(()-> animationTimerTrigger.set(true), 1, 50, TimeUnit.MILLISECONDS); + renderScheduler.scheduleAtFixedRate(() -> animationTimerTrigger.set(true), 1, 50, TimeUnit.MILLISECONDS); } /** @@ -258,7 +263,6 @@ void paintFramebuffer() { framecount++; } - public void render(int alpha) { var currentVAO = glGetInteger(GL_VERTEX_ARRAY_BINDING); var currentFB = glGetInteger(GL_READ_FRAMEBUFFER_BINDING); @@ -274,6 +278,7 @@ public void render(int alpha) { glBindVertexArray(currentVAO); glBindFramebuffer(GL_FRAMEBUFFER, currentFB); } + /** * Start the window and Render Thread; we're ready to go. */ @@ -289,6 +294,7 @@ public Runnable start(@Nullable String mcVersion, final String forgeVersion) { } private static final String ERROR_URL = "https://links.neoforged.net/early-display-errors"; + @Override public String getGLVersion() { return this.glVersion; @@ -309,9 +315,9 @@ private void crashElegantly(String errorDetails) { msgBuilder.append(errorDetails); msgBuilder.append("\n\n"); msgBuilder.append("If you click yes, we will try and open " + ERROR_URL + " in your default browser"); - LOGGER.error("ERROR DISPLAY\n"+msgBuilder); + LOGGER.error("ERROR DISPLAY\n" + msgBuilder); // we show the display on a new dedicated thread - Executors.newSingleThreadExecutor().submit(()-> { + Executors.newSingleThreadExecutor().submit(() -> { var res = TinyFileDialogs.tinyfd_messageBox("Minecraft: NeoForge", msgBuilder.toString(), "yesno", "error", false); if (res) { try { @@ -323,6 +329,7 @@ private void crashElegantly(String errorDetails) { System.exit(1); }); } + /** * Called to initialize the window when preparing for the Render Thread. * @@ -381,16 +388,16 @@ public void initWindow(@Nullable String mcVersion) { } long window = 0; var successfulWindow = new AtomicBoolean(false); - var windowFailFuture = renderScheduler.schedule(()->{ + var windowFailFuture = renderScheduler.schedule(() -> { if (!successfulWindow.get()) crashElegantly("Timed out trying to setup the Game Window."); }, 10, TimeUnit.SECONDS); int versidx = 0; var skipVersions = FMLConfig.getListConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_SKIP_GL_VERSIONS); - final String[] lastGLError=new String[GL_VERSIONS.length]; + final String[] lastGLError = new String[GL_VERSIONS.length]; do { final var glVersionToTry = GL_VERSIONS[versidx][0] + "." + GL_VERSIONS[versidx][1]; if (skipVersions.contains(glVersionToTry)) { - LOGGER.info("Skipping GL version "+ glVersionToTry+" because of configuration"); + LOGGER.info("Skipping GL version " + glVersionToTry + " because of configuration"); versidx++; continue; } @@ -408,22 +415,23 @@ public void initWindow(@Nullable String mcVersion) { versidx++; } while (window == 0 && versidx < GL_VERSIONS.length); // LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(12)); - if (versidx== GL_VERSIONS.length && window == 0) { - LOGGER.error("Failed to find any valid GLFW profile. "+lastGLError[0]); - - crashElegantly("Failed to find a valid GLFW profile.\nWe tried "+ - Arrays.stream(GL_VERSIONS).map(p->p[0]+"."+p[1]).filter(o -> !skipVersions.contains(o)) - .collect(Collector.of(()->new StringJoiner(", ").setEmptyValue("no versions"), StringJoiner::add, StringJoiner::merge, StringJoiner::toString))+ - " but none of them worked.\n"+ Arrays.stream(lastGLError).filter(Objects::nonNull).collect(Collectors.joining("\n"))); + if (versidx == GL_VERSIONS.length && window == 0) { + LOGGER.error("Failed to find any valid GLFW profile. " + lastGLError[0]); + + crashElegantly("Failed to find a valid GLFW profile.\nWe tried " + + Arrays.stream(GL_VERSIONS).map(p -> p[0] + "." + p[1]).filter(o -> !skipVersions.contains(o)) + .collect(Collector.of(() -> new StringJoiner(", ").setEmptyValue("no versions"), StringJoiner::add, StringJoiner::merge, StringJoiner::toString)) + + + " but none of them worked.\n" + Arrays.stream(lastGLError).filter(Objects::nonNull).collect(Collectors.joining("\n"))); throw new IllegalStateException("Failed to create a GLFW window with any profile"); } successfulWindow.set(true); if (!windowFailFuture.cancel(true)) throw new IllegalStateException("We died but didn't somehow?"); - var requestedVersion = GL_VERSIONS[versidx-1][0]+"."+GL_VERSIONS[versidx-1][1]; + var requestedVersion = GL_VERSIONS[versidx - 1][0] + "." + GL_VERSIONS[versidx - 1][1]; var maj = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR); var min = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR); - var gotVersion = maj+"."+min; - LOGGER.info("Requested GL version "+requestedVersion+" got version "+gotVersion); + var gotVersion = maj + "." + min; + LOGGER.info("Requested GL version " + requestedVersion + " got version " + gotVersion); this.glVersion = gotVersion; this.window = window; @@ -475,7 +483,7 @@ public void initWindow(@Nullable String mcVersion) { } private void badWindowHandler(final int code, final long desc) { - LOGGER.error("Got error from GLFW window init: "+code+ " "+MemoryUtil.memUTF8(desc)); + LOGGER.error("Got error from GLFW window init: " + code + " " + MemoryUtil.memUTF8(desc)); } private void winResize(long window, int width, int height) { @@ -484,6 +492,7 @@ private void winResize(long window, int width, int height) { this.winHeight = height; } } + private void fbResize(long window, int width, int height) { if (window == this.window && width != 0 && height != 0) { this.fbWidth = width; @@ -497,6 +506,7 @@ private void winMove(long window, int x, int y) { this.winY = y; } } + private void handleLastGLFWError(BiConsumer handler) { try (MemoryStack memorystack = MemoryStack.stackPush()) { PointerBuffer pointerbuffer = memorystack.mallocPointer(1); @@ -519,9 +529,9 @@ public long setupMinecraftWindow(final IntSupplier width, final IntSupplier heig // wait for the window to actually be initialized try { this.initializationFuture.get(30, TimeUnit.SECONDS); - } catch(InterruptedException | ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); - } catch(TimeoutException e) { + } catch (TimeoutException e) { Thread.dumpStack(); crashElegantly("We seem to be having trouble initializing the window, waited for 30 seconds"); } @@ -534,11 +544,11 @@ public long setupMinecraftWindow(final IntSupplier width, final IntSupplier heig var renderlockticket = false; do { try { - renderlockticket = renderLock.tryAcquire(100, TimeUnit.MILLISECONDS); - if (++tries > 9) { - Thread.dumpStack(); - crashElegantly("We seem to be having trouble handing off the window, tried for 1 second"); - } + renderlockticket = renderLock.tryAcquire(100, TimeUnit.MILLISECONDS); + if (++tries > 9) { + Thread.dumpStack(); + crashElegantly("We seem to be having trouble handing off the window, tried for 1 second"); + } } catch (InterruptedException e) { Thread.interrupted(); } @@ -580,7 +590,7 @@ public void updateFramebufferSize(final IntConsumer width, final IntConsumer hei @Override public Supplier loadingOverlay(final Supplier mc, final Supplier ri, final Consumer> ex, final boolean fade) { try { - return (Supplier)loadingOverlay.invoke(null, mc, ri, ex, this); + return (Supplier) loadingOverlay.invoke(null, mc, ri, ex, this); } catch (Throwable e) { throw new IllegalStateException("How did you get here?", e); } @@ -590,8 +600,8 @@ public Supplier loadingOverlay(final Supplier mc, final Supplier ri public void updateModuleReads(final ModuleLayer layer) { var fm = layer.findModule("neoforge").orElseThrow(); getClass().getModule().addReads(fm); - var clz = FMLLoader.getGameLayer().findModule("neoforge").map(l->Class.forName(l, "net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay")).orElseThrow(); - var methods = Arrays.stream(clz.getMethods()).filter(m-> Modifier.isStatic(m.getModifiers())).collect(Collectors.toMap(Method::getName, Function.identity())); + var clz = FMLLoader.getGameLayer().findModule("neoforge").map(l -> Class.forName(l, "net.neoforged.neoforge.client.loading.NeoForgeLoadingOverlay")).orElseThrow(); + var methods = Arrays.stream(clz.getMethods()).filter(m -> Modifier.isStatic(m.getModifiers())).collect(Collectors.toMap(Method::getName, Function.identity())); loadingOverlay = methods.get("newInstance"); } diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/EarlyFramebuffer.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/EarlyFramebuffer.java index ee492a851..5deb0208a 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/EarlyFramebuffer.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/EarlyFramebuffer.java @@ -5,11 +5,10 @@ package net.neoforged.fml.earlydisplay; -import java.nio.IntBuffer; - -import static net.neoforged.fml.earlydisplay.RenderElement.clamp; import static org.lwjgl.opengl.GL32C.*; +import java.nio.IntBuffer; + public class EarlyFramebuffer { private final int framebuffer; private final int texture; @@ -23,7 +22,7 @@ public class EarlyFramebuffer { glBindFramebuffer(GL_FRAMEBUFFER, this.framebuffer); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, this.texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, context.width() * context.scale(), context.height() * context.scale(), 0, GL_RGBA, GL_UNSIGNED_BYTE, (IntBuffer)null); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, context.width() * context.scale(), context.height() * context.scale(), 0, GL_RGBA, GL_UNSIGNED_BYTE, (IntBuffer) null); glTexParameterIi(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterIi(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this.texture, 0); @@ -39,13 +38,13 @@ void deactivate() { } void draw(int windowFBWidth, int windowFBHeight) { - var wscale = ((float)windowFBWidth / this.context.width()); - var hscale = ((float)windowFBHeight / this.context.height()); + var wscale = ((float) windowFBWidth / this.context.width()); + var hscale = ((float) windowFBHeight / this.context.height()); var scale = this.context.scale() * Math.min(wscale, hscale) / 2f; - var wleft = (int)(windowFBWidth * 0.5f - scale * this.context.width()); - var wtop = (int)(windowFBHeight * 0.5f - scale * this.context.height()); - var wright = (int)(windowFBWidth * 0.5f + scale * this.context.width()); - var wbottom = (int)(windowFBHeight * 0.5f + scale * this.context.height()); + var wleft = (int) (windowFBWidth * 0.5f - scale * this.context.width()); + var wtop = (int) (windowFBHeight * 0.5f - scale * this.context.height()); + var wright = (int) (windowFBWidth * 0.5f + scale * this.context.width()); + var wbottom = (int) (windowFBHeight * 0.5f + scale * this.context.height()); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, this.framebuffer); final var colour = this.context.colourScheme().background(); diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ElementShader.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ElementShader.java index 1d8f5568b..d35b417df 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ElementShader.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/ElementShader.java @@ -5,7 +5,6 @@ package net.neoforged.fml.earlydisplay; - import static org.lwjgl.opengl.GL32C.*; public class ElementShader { @@ -20,36 +19,36 @@ public void init() { // Bind the source of our shaders to the ones created above glShaderSource(fragmentShader, """ - #version 150 core - uniform sampler2D tex; - uniform int rendertype; - in vec2 fTex; - in vec4 fColour; - out vec4 fragColor; - - void main() { - if (rendertype == 0) - fragColor = vec4(1,1,1,texture(tex, fTex).r) * fColour; - if (rendertype == 1) - fragColor = texture(tex, fTex) * fColour; - if (rendertype == 2) - fragColor = fColour; - } - """); + #version 150 core + uniform sampler2D tex; + uniform int rendertype; + in vec2 fTex; + in vec4 fColour; + out vec4 fragColor; + + void main() { + if (rendertype == 0) + fragColor = vec4(1,1,1,texture(tex, fTex).r) * fColour; + if (rendertype == 1) + fragColor = texture(tex, fTex) * fColour; + if (rendertype == 2) + fragColor = fColour; + } + """); glShaderSource(vertexShader, """ - #version 150 core - in vec2 position; - in vec2 tex; - in vec4 colour; - uniform vec2 screenSize; - out vec2 fTex; - out vec4 fColour; - void main() { - fTex = tex; - fColour = colour; - gl_Position = vec4((position/screenSize) * 2 - 1, 0.0, 1.0); - } - """); + #version 150 core + in vec2 position; + in vec2 tex; + in vec4 colour; + uniform vec2 screenSize; + out vec2 fTex; + out vec4 fColour; + void main() { + fTex = tex; + fColour = colour; + gl_Position = vec4((position/screenSize) * 2 - 1, 0.0, 1.0); + } + """); // Compile the vertex and fragment elementShader so that we can use them glCompileShader(vertexShader); @@ -87,6 +86,7 @@ void main() { public void activate() { glUseProgram(program); } + public void updateTextureUniform(int textureNumber) { glUniform1i(textureUniform, textureNumber); } diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/PerformanceInfo.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/PerformanceInfo.java index dc5604cc5..a5407df22 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/PerformanceInfo.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/PerformanceInfo.java @@ -6,13 +6,11 @@ package net.neoforged.fml.earlydisplay; import com.sun.management.OperatingSystemMXBean; - import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; public class PerformanceInfo { - private final OperatingSystemMXBean osBean; private final MemoryMXBean memoryBean; float memory; diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/RenderElement.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/RenderElement.java index fc134a373..2d660c4cc 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/RenderElement.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/RenderElement.java @@ -5,15 +5,14 @@ package net.neoforged.fml.earlydisplay; -import net.neoforged.fml.loading.progress.Message; -import net.neoforged.fml.loading.progress.ProgressMeter; -import net.neoforged.fml.loading.progress.StartupNotificationManager; +import static org.lwjgl.opengl.GL32C.*; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; - -import static org.lwjgl.opengl.GL32C.*; +import net.neoforged.fml.loading.progress.Message; +import net.neoforged.fml.loading.progress.ProgressMeter; +import net.neoforged.fml.loading.progress.StartupNotificationManager; public class RenderElement { static final int INDEX_TEXTURE_OFFSET = 5; @@ -23,7 +22,6 @@ public class RenderElement { private int retireCount; interface Renderer { - void accept(SimpleBufferBuilder bb, DisplayContext context, int frame); default Renderer then(Renderer r) { @@ -34,9 +32,11 @@ default Renderer then(Renderer r) { }; } } + interface TextureRenderer { void accept(SimpleBufferBuilder bb, DisplayContext context, int[] size, int frame); } + interface Initializer extends Supplier {} interface TextGenerator { @@ -72,28 +72,28 @@ private static void startupLogMessages(SimpleBufferBuilder bb, SimpleFont font, List texts = new ArrayList<>(); for (int i = messages.size() - 1; i >= 0; i--) { final StartupNotificationManager.AgeMessage pair = messages.get(i); - final float fade = clamp((4000.0f - (float) pair.age() - ( i - 4 ) * 1000.0f) / 5000.0f, 0.0f, 1.0f); - if (fade <0.01f) continue; + final float fade = clamp((4000.0f - (float) pair.age() - (i - 4) * 1000.0f) / 5000.0f, 0.0f, 1.0f); + if (fade < 0.01f) continue; Message msg = pair.message(); - int colour = Math.min((int)(fade * 255f), globalAlpha) << 24 | 0xFFFFFF; - texts.add(new SimpleFont.DisplayText(msg.getText()+"\n", colour)); + int colour = Math.min((int) (fade * 255f), globalAlpha) << 24 | 0xFFFFFF; + texts.add(new SimpleFont.DisplayText(msg.getText() + "\n", colour)); } - font.generateVerticesForTexts(10, context.scaledHeight() - texts.size() * font.lineSpacing() + font.descent() - 10, bb, texts.toArray(SimpleFont.DisplayText[]::new)); + font.generateVerticesForTexts(10, context.scaledHeight() - texts.size() * font.lineSpacing() + font.descent() - 10, bb, texts.toArray(SimpleFont.DisplayText[]::new)); } + public static RenderElement monag() { return new RenderElement(RenderElement.initializeTexture("monagstudios.png", 45000, 4, (bb, ctx, sz, frame) -> { var size = 256; var x0 = (ctx.width() - 2 * size) / 2; var y0 = 64; - QuadHelper.loadQuad(bb, x0, x0+size, y0, y0+size/2f, 0f, 1f, 0f, 0.5f, 0xFFFFFFFF); - QuadHelper.loadQuad(bb, x0+size, x0+2*size, y0, y0+size/2f, 0f, 1f, 0.5f, 1f, 0xFFFFFFFF); + QuadHelper.loadQuad(bb, x0, x0 + size, y0, y0 + size / 2f, 0f, 1f, 0f, 0.5f, 0xFFFFFFFF); + QuadHelper.loadQuad(bb, x0 + size, x0 + 2 * size, y0, y0 + size / 2f, 0f, 1f, 0.5f, 1f, 0xFFFFFFFF); })); - } public static RenderElement mojang(final int textureId, final int frameStart) { - return new RenderElement(()->(bb, ctx, frame) -> { + return new RenderElement(() -> (bb, ctx, frame) -> { var size = 256 * ctx.scale(); var x0 = (ctx.scaledWidth() - 2 * size) / 2; var y0 = 64 * ctx.scale() + 32; @@ -102,22 +102,23 @@ public static RenderElement mojang(final int textureId, final int frameStart) { var fade = Math.min((frame - frameStart) * 10, 255); glBindTexture(GL_TEXTURE_2D, textureId); bb.begin(SimpleBufferBuilder.Format.POS_TEX_COLOR, SimpleBufferBuilder.Mode.QUADS); - QuadHelper.loadQuad(bb, x0, x0+size, y0, y0+size/2f, 0f, 1f, 0f, 0.5f, (fade << 24) | 0xFFFFFF); - QuadHelper.loadQuad(bb, x0+size, x0+2*size, y0, y0+size/2f, 0f, 1f, 0.5f, 1f, (fade << 24) | 0xFFFFFF); + QuadHelper.loadQuad(bb, x0, x0 + size, y0, y0 + size / 2f, 0f, 1f, 0f, 0.5f, (fade << 24) | 0xFFFFFF); + QuadHelper.loadQuad(bb, x0 + size, x0 + 2 * size, y0, y0 + size / 2f, 0f, 1f, 0.5f, 1f, (fade << 24) | 0xFFFFFF); bb.draw(); glBindTexture(GL_TEXTURE_2D, 0); }); } + public static RenderElement logMessageOverlay(SimpleFont font) { return new RenderElement(RenderElement.initializeText(font, RenderElement::startupLogMessages)); } public static RenderElement forgeVersionOverlay(SimpleFont font, String version) { - return new RenderElement(RenderElement.initializeText(font, (bb, fnt, ctx)-> - font.generateVerticesForTexts(ctx.scaledWidth() - font.stringWidth(version) - 10, - ctx.scaledHeight() - font.lineSpacing() + font.descent() - 10, bb, - new SimpleFont.DisplayText(version, ctx.colourScheme.foreground().packedint(RenderElement.globalAlpha))))); + return new RenderElement(RenderElement.initializeText(font, (bb, fnt, ctx) -> font.generateVerticesForTexts(ctx.scaledWidth() - font.stringWidth(version) - 10, + ctx.scaledHeight() - font.lineSpacing() + font.descent() - 10, bb, + new SimpleFont.DisplayText(version, ctx.colourScheme.foreground().packedint(RenderElement.globalAlpha))))); } + public static RenderElement squir() { return new RenderElement(RenderElement.initializeTexture("squirrel.png", 45000, 3, (bb, context, size, frame) -> { var inset = 5f; @@ -135,7 +136,7 @@ public static RenderElement squir() { public static RenderElement fox(SimpleFont font) { return new RenderElement(RenderElement.initializeTexture("fox_running.png", 128000, 2, (bb, context, size, frame) -> { int framecount = 28; - float aspect = size[0] * (float)framecount / size[1]; + float aspect = size[0] * (float) framecount / size[1]; int outsize = size[0]; int offset = outsize / 6; var x0 = context.scaledWidth() - outsize * context.scale() + offset; @@ -143,11 +144,12 @@ public static RenderElement fox(SimpleFont font) { var y0 = context.scaledHeight() - outsize * context.scale() / aspect - font.descent() - font.lineSpacing(); var y1 = context.scaledHeight() - font.descent() - font.lineSpacing(); int frameidx = frame % framecount; - float framesize = 1 / (float)framecount; + float framesize = 1 / (float) framecount; float framepos = frameidx * framesize; - QuadHelper.loadQuad(bb, x0, x1, y0, y1, 0f, 1f, framepos, framepos+framesize, globalAlpha << 24 | 0xFFFFFF); + QuadHelper.loadQuad(bb, x0, x1, y0, y1, 0f, 1f, framepos, framepos + framesize, globalAlpha << 24 | 0xFFFFFF); })); } + public static RenderElement progressBars(SimpleFont font) { return new RenderElement(() -> (bb, ctx, frame) -> RenderElement.startupProgressBars(font, bb, ctx, frame)); } @@ -171,35 +173,38 @@ public static void startupProgressBars(SimpleFont font, final SimpleBufferBuilde if (acc != null) acc.accept(buffer, context, frameNumber); } + private static final int BAR_HEIGHT = 20; private static final int BAR_WIDTH = 400; + private static Renderer barRenderer(int cnt, int alpha, SimpleFont font, ProgressMeter pm, DisplayContext context) { var barSpacing = font.lineSpacing() - font.descent() + BAR_HEIGHT; var y = 250 * context.scale() + cnt * barSpacing; var colour = (alpha << 24) | 0xFFFFFF; Renderer bar; if (pm.steps() == 0) { - bar = progressBar(ctx->new int[] {(ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y + font.lineSpacing() - font.descent(), BAR_WIDTH * ctx.scale()}, f->colour, frame -> indeterminateBar(frame, cnt == 0)); + bar = progressBar(ctx -> new int[] { (ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y + font.lineSpacing() - font.descent(), BAR_WIDTH * ctx.scale() }, f -> colour, frame -> indeterminateBar(frame, cnt == 0)); } else { - bar = progressBar(ctx -> new int[]{(ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y + font.lineSpacing() - font.descent(), BAR_WIDTH * ctx.scale()}, f -> colour, f -> new float[]{0f, pm.progress()}); + bar = progressBar(ctx -> new int[] { (ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y + font.lineSpacing() - font.descent(), BAR_WIDTH * ctx.scale() }, f -> colour, f -> new float[] { 0f, pm.progress() }); } Renderer label = (bb, ctx, frame) -> renderText(font, text((ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y, pm.label().getText(), colour), bb, ctx); return bar.then(label); } + private static float[] indeterminateBar(int frame, boolean isActive) { if (RenderElement.globalAlpha != 0xFF || !isActive) { - return new float[] {0f,1f}; + return new float[] { 0f, 1f }; } else { var progress = frame % 100; - return new float[]{clamp((progress - 2) / 100f, 0f, 1f), clamp((progress + 2) / 100f, 0f, 1f)}; + return new float[] { clamp((progress - 2) / 100f, 0f, 1f), clamp((progress + 2) / 100f, 0f, 1f) }; } } private static void memoryInfo(SimpleFont font, final SimpleBufferBuilder buffer, final DisplayContext context, final int frameNumber) { var y = 10 * context.scale(); PerformanceInfo pi = context.performance(); - final int colour = hsvToRGB((1.0f - (float)Math.pow(pi.memory(), 1.5f)) / 3f, 1.0f, 0.5f); - var bar = progressBar(ctx -> new int[]{(ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y, BAR_WIDTH * ctx.scale()}, f -> colour, f -> new float[]{0f, pi.memory()}); + final int colour = hsvToRGB((1.0f - (float) Math.pow(pi.memory(), 1.5f)) / 3f, 1.0f, 0.5f); + var bar = progressBar(ctx -> new int[] { (ctx.scaledWidth() - BAR_WIDTH * ctx.scale()) / 2, y, BAR_WIDTH * ctx.scale() }, f -> colour, f -> new float[] { 0f, pi.memory() }); var width = font.stringWidth(pi.text()); Renderer label = (bb, ctx, frame) -> renderText(font, text(ctx.scaledWidth() / 2 - width / 2, y + 18, pi.text(), context.colourScheme.foreground().packedint(globalAlpha)), bb, ctx); bar.then(label).accept(buffer, context, frameNumber); @@ -216,6 +221,7 @@ interface ProgressDisplay { interface BarPosition { int[] location(DisplayContext context); } + public static Renderer progressBar(BarPosition position, ColourFunction colourFunction, ProgressDisplay progressDisplay) { return (bb, context, frame) -> { var colour = colourFunction.colour(frame); @@ -238,7 +244,7 @@ public static Renderer progressBar(BarPosition position, ColourFunction colourFu y1 -= inset; QuadHelper.loadQuad(bb, x0, x1, y0, y1, 0f, 0f, 0f, 0f, context.colourScheme().background().packedint(RenderElement.globalAlpha)); - x1 = x0 + inset + (int)(progress[1] * pos[2]); + x1 = x0 + inset + (int) (progress[1] * pos[2]); x0 += inset + progress[0] * pos[2]; y0 += inset; y1 -= inset; @@ -262,8 +268,9 @@ private static void renderText(final SimpleFont font, final TextGenerator textGe private static TextGenerator text(int x, int y, String text, int colour) { return (bb, font, context) -> font.generateVerticesForTexts(x, y, bb, new SimpleFont.DisplayText(text, colour)); } + private static Initializer initializeTexture(final String textureFileName, int size, int textureNumber, TextureRenderer positionAndColour) { - return ()->{ + return () -> { int[] imgSize = STBHelper.loadTextureFromClasspath(textureFileName, size, GL_TEXTURE0 + textureNumber + INDEX_TEXTURE_OFFSET); return (bb, ctx, frame) -> { ctx.elementShader().updateTextureUniform(textureNumber + INDEX_TEXTURE_OFFSET); @@ -279,7 +286,6 @@ private static void renderTexture(SimpleBufferBuilder bb, DisplayContext context bb.draw(); } - public static float clamp(float num, float min, float max) { if (num < min) { return min; @@ -297,15 +303,15 @@ public static int clamp(int num, int min, int max) { } public static int hsvToRGB(float hue, float saturation, float value) { - int i = (int)(hue * 6.0F) % 6; - float f = hue * 6.0F - (float)i; + int i = (int) (hue * 6.0F) % 6; + float f = hue * 6.0F - (float) i; float f1 = value * (1.0F - saturation); float f2 = value * (1.0F - f * saturation); float f3 = value * (1.0F - (1.0F - f) * saturation); float f4; float f5; float f6; - switch(i) { + switch (i) { case 0: f4 = value; f5 = f3; @@ -340,9 +346,9 @@ public static int hsvToRGB(float hue, float saturation, float value) { throw new RuntimeException("Something went wrong when converting from HSV to RGB. Input was " + hue + ", " + saturation + ", " + value); } - int j = clamp((int)(f4 * 255.0F), 0, 255); - int k = clamp((int)(f5 * 255.0F), 0, 255); - int l = clamp((int)(f6 * 255.0F), 0, 255); + int j = clamp((int) (f4 * 255.0F), 0, 255); + int k = clamp((int) (f5 * 255.0F), 0, 255); + int l = clamp((int) (f6 * 255.0F), 0, 255); return 0xFF << 24 | j << 16 | k << 8 | l; } } diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/STBHelper.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/STBHelper.java index 100cda751..9c4ccdaa5 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/STBHelper.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/STBHelper.java @@ -5,23 +5,22 @@ package net.neoforged.fml.earlydisplay; -import org.lwjgl.BufferUtils; -import org.lwjgl.stb.STBImage; -import org.lwjgl.system.MemoryUtil; +import static org.lwjgl.opengl.GL32C.*; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.util.Objects; - -import static org.lwjgl.opengl.GL32C.*; +import org.lwjgl.BufferUtils; +import org.lwjgl.stb.STBImage; +import org.lwjgl.system.MemoryUtil; public class STBHelper { public static ByteBuffer readFromClasspath(final String name, int initialCapacity) { ByteBuffer buf; try (var channel = Channels.newChannel( - Objects.requireNonNull(STBHelper.class.getClassLoader().getResourceAsStream(name), "The resource "+name+" cannot be found"))) { + Objects.requireNonNull(STBHelper.class.getClassLoader().getResourceAsStream(name), "The resource " + name + " cannot be found"))) { buf = BufferUtils.createByteBuffer(initialCapacity); while (true) { var readbytes = channel.read(buf); @@ -55,7 +54,7 @@ public static int[] loadTextureFromClasspath(String file, int size, int textureN glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lw[0], lh[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, img); glActiveTexture(GL_TEXTURE0); MemoryUtil.memFree(img); - return new int[] {lw[0], lh[0]}; + return new int[] { lw[0], lh[0] }; } public static ByteBuffer loadImageFromClasspath(String file, int size, int[] width, int[] height, int[] channels) { diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleBufferBuilder.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleBufferBuilder.java index ec7d8f8b6..c38f23d51 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleBufferBuilder.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleBufferBuilder.java @@ -5,13 +5,12 @@ package net.neoforged.fml.earlydisplay; -import org.lwjgl.system.MemoryUtil; +import static org.lwjgl.opengl.GL32C.*; import java.io.Closeable; import java.nio.ByteBuffer; import java.util.Arrays; - -import static org.lwjgl.opengl.GL32C.*; +import org.lwjgl.system.MemoryUtil; /** * A very simple, Mojang inspired BufferBuilder. @@ -35,24 +34,23 @@ * @author covers1624 */ public class SimpleBufferBuilder implements Closeable { - private static final MemoryUtil.MemoryAllocator ALLOCATOR = MemoryUtil.getAllocator(false); - + private static final int[] VERTEX_ARRAYS = new int[Format.values().length]; private static final int[] VERTEX_BUFFERS = new int[Format.values().length]; private static final int[] VERTEX_BUFFER_LENGTHS = new int[Format.values().length]; private static int elementBuffer = 0; private static int elementBufferVertexLength = 0; - + static { Arrays.fill(VERTEX_ARRAYS, 0); Arrays.fill(VERTEX_BUFFERS, 0); Arrays.fill(VERTEX_BUFFER_LENGTHS, 0); } - + private long bufferAddr; // Pointer to the backing buffer. private ByteBuffer buffer; // ByteBuffer view of the backing buffer. - + private Format format; // The current format we are buffering. private Mode mode; // The current mode we are buffering. private boolean building; // If we are building the buffer. @@ -74,32 +72,32 @@ public SimpleBufferBuilder(int capacity) { bufferAddr = ALLOCATOR.malloc(capacity); buffer = MemoryUtil.memByteBuffer(bufferAddr, capacity); } - + public static void destroy() { glDeleteBuffers(VERTEX_BUFFERS); glDeleteBuffers(elementBuffer); glDeleteVertexArrays(VERTEX_ARRAYS); } - + private static void ensureElementBufferLength(int vertices) { if (elementBufferVertexLength >= vertices) { return; } - + // treating it as immutable storage, even though it's not final var newElementBuffer = glGenBuffers(); var newElementBufferVertexLength = Math.max(1024, elementBufferVertexLength); while (newElementBufferVertexLength < vertices) { newElementBufferVertexLength *= 2; } - + final var oldIndexCount = elementBufferVertexLength + elementBufferVertexLength / 2; final var newIndexCount = newElementBufferVertexLength + newElementBufferVertexLength / 2; - + // allocate new buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newElementBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, newIndexCount * 4L, GL_STATIC_DRAW); - + // mapping avoids creating additional CPU copies of the data // unsynchronized is fine because this is a brand-new buffer, and the old contents will be copied in afterward // also can invalidate the whole buffer too, similarly because brand new, don't care what was there before @@ -107,10 +105,10 @@ private static void ensureElementBufferLength(int vertices) { final var mappingSize = (newIndexCount - oldIndexCount) * 4; final var mappedBuffer = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, mappingOffset, mappingSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - if(mappedBuffer == null){ + if (mappedBuffer == null) { throw new NullPointerException("OpenGL buffer mapping failed"); } - + final int quads = newElementBufferVertexLength / 4; final int oldQuads = elementBufferVertexLength / 4; // generate indices for the extension to the buffer @@ -130,12 +128,12 @@ private static void ensureElementBufferLength(int vertices) { glBindBuffer(GL_COPY_READ_BUFFER, 0); } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - + glDeleteBuffers(elementBuffer); elementBuffer = newElementBuffer; elementBufferVertexLength = newElementBufferVertexLength; } - + /** * Start building a new set of vertex data in the * given format and mode. @@ -241,6 +239,7 @@ public SimpleBufferBuilder colour(int packedColor) { elementIndex++; return this; } + /** * Buffer a color element. * @@ -325,7 +324,7 @@ public int finishAndUpload() { // Reset position to 0, limit the buffer to our index. buffer.position(0); buffer.limit(index); - + // Upload the raw vertex data in dynamic mode. final int vbo = VERTEX_BUFFERS[format.ordinal()]; final int vboSize = VERTEX_BUFFER_LENGTHS[format.ordinal()]; @@ -333,7 +332,7 @@ public int finishAndUpload() { if (vboSize < index) { // expand buffer, it's not big enough var newVBOSize = Math.max(1024, vboSize); - while (newVBOSize < index){ + while (newVBOSize < index) { newVBOSize *= 2; } // because everything is overwritten anyway, we can do an in-place reallocation @@ -341,17 +340,17 @@ public int finishAndUpload() { VERTEX_BUFFER_LENGTHS[format.ordinal()] = newVBOSize; } glBufferSubData(GL_ARRAY_BUFFER, 0, buffer); - + // The number of indices for triangles is equal to our vertex count, as that is // what we operate in. However, for Quads, we have exactly vertices + vertices / 2 // vertices once we convert the quads to triangles. indices = mode == Mode.TRIANGLES ? vertices : vertices + vertices / 2; - + if (mode == Mode.QUADS) { ensureElementBufferLength(vertices); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); } - + return indices; } finally { // Reset builder state for next begin call. @@ -382,11 +381,11 @@ public void draw() { // Make new vertex array and buffers! vao = glGenVertexArrays(); vbo = glGenBuffers(); - + // Cache the vertex array and buffers for future re-use. VERTEX_ARRAYS[format.ordinal()] = vao; VERTEX_BUFFERS[format.ordinal()] = vbo; - + // Ask our Format to set up its data layout for the vertex array. // but only once, the VAO saves this state glBindVertexArray(vao); @@ -396,16 +395,16 @@ public void draw() { } // Bind the vertex array and buffers! glBindVertexArray(vao); - + // Upload the data. int indices = finishAndUpload(); - + if (mode == Mode.QUADS) { glDrawElements(GL_TRIANGLES, indices, GL_UNSIGNED_INT, 0); } else { glDrawArrays(GL_TRIANGLES, 0, indices); } - + // Unbind the vertex array. glBindVertexArray(0); } diff --git a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleFont.java b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleFont.java index 1ff5ef613..b6c260c00 100644 --- a/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleFont.java +++ b/earlydisplay/src/main/java/net/neoforged/fml/earlydisplay/SimpleFont.java @@ -5,6 +5,12 @@ package net.neoforged.fml.earlydisplay; +import static org.lwjgl.opengl.GL32C.*; +import static org.lwjgl.stb.STBTruetype.*; +import static org.lwjgl.system.MemoryUtil.NULL; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBTTAlignedQuad; import org.lwjgl.stb.STBTTFontinfo; @@ -12,18 +18,11 @@ import org.lwjgl.stb.STBTTPackRange; import org.lwjgl.stb.STBTTPackedchar; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -import static org.lwjgl.opengl.GL32C.*; -import static org.lwjgl.stb.STBTruetype.*; -import static org.lwjgl.system.MemoryUtil.NULL; - public class SimpleFont { private final int textureNumber; private final int lineSpacing; private final int descent; - private final int GLYPH_COUNT = 127-32; + private final int GLYPH_COUNT = 127 - 32; private Glyph[] glyphs; private record Glyph(char c, int charwidth, int[] pos, float[] uv) { @@ -36,7 +35,7 @@ Pos loadQuad(Pos pos, int colour, SimpleBufferBuilder bb) { bb.pos(x1, y0).tex(uv()[2], uv()[1]).colour(colour).endVertex(); bb.pos(x0, y1).tex(uv()[0], uv()[3]).colour(colour).endVertex(); bb.pos(x1, y1).tex(uv()[2], uv()[3]).colour(colour).endVertex(); - return new Pos(pos.x()+charwidth(), pos.y(), pos.minx()); + return new Pos(pos.x() + charwidth(), pos.y(), pos.minx()); } } @@ -55,10 +54,10 @@ public SimpleFont(String fontName, int scale, int bufferSize, int textureNumber) var lineGap = new float[1]; int fontSize = 24; stbtt_GetScaledFontVMetrics(buf, 0, fontSize, ascent, descent, lineGap); - this.lineSpacing = (int)(ascent[0] - descent[0] + lineGap[0]); - this.descent = (int)Math.floor(descent[0]); + this.lineSpacing = (int) (ascent[0] - descent[0] + lineGap[0]); + this.descent = (int) Math.floor(descent[0]); int fontTextureId = glGenTextures(); - glActiveTexture(GL_TEXTURE0+textureNumber); + glActiveTexture(GL_TEXTURE0 + textureNumber); this.textureNumber = textureNumber; glBindTexture(GL_TEXTURE_2D, fontTextureId); try (var packedchars = STBTTPackedchar.malloc(GLYPH_COUNT)) { @@ -94,7 +93,7 @@ public SimpleFont(String fontName, int scale, int bufferSize, int textureNumber) x[0] = 0f; y[0] = fontSize; stbtt_GetPackedQuad(packedchars, texwidth, texheight, i, x, y, q, true); - glyphs[i] = new Glyph((char) (i + 32), (int) (x[0] - 0f), new int[]{(int) q.x0(), (int) q.y0(), (int) q.x1(), (int) q.y1()}, new float[]{q.s0(), q.t0(), q.s1(), q.t1()}); + glyphs[i] = new Glyph((char) (i + 32), (int) (x[0] - 0f), new int[] { (int) q.x0(), (int) q.y0(), (int) q.x1(), (int) q.y1() }, new float[] { q.s0(), q.t0(), q.s1(), q.t1() }); } } } @@ -131,6 +130,7 @@ public int stringWidth(String text) { } return len; } + private record Pos(int x, int y, int minx) {} /** @@ -148,11 +148,11 @@ Pos generateStringArray(SimpleFont font, Pos pos, SimpleBufferBuilder bb) { for (int i = 0; i < asBytes().length; i++) { byte c = asBytes()[i]; pos = switch (c) { - case '\n' -> new Pos(pos.minx(), pos.y()+font.lineSpacing(), pos.minx()); - case '\t' -> new Pos(pos.x()+font.glyphs[0].charwidth() * 4, pos.y(), pos.minx()); - case ' ' -> new Pos(pos.x()+font.glyphs[0].charwidth(), pos.y(), pos.minx()); + case '\n' -> new Pos(pos.minx(), pos.y() + font.lineSpacing(), pos.minx()); + case '\t' -> new Pos(pos.x() + font.glyphs[0].charwidth() * 4, pos.y(), pos.minx()); + case ' ' -> new Pos(pos.x() + font.glyphs[0].charwidth(), pos.y(), pos.minx()); default -> { - if (c-32 < font.GLYPH_COUNT && c > 32) { + if (c - 32 < font.GLYPH_COUNT && c > 32) { pos = font.glyphs[c - 32].loadQuad(pos, colour(), bb); } yield pos; @@ -165,8 +165,9 @@ Pos generateStringArray(SimpleFont font, Pos pos, SimpleBufferBuilder bb) { /** * Generate vertices for a set of display texts - * @param x The starting screen x coordinate - * @param y The starting screen y coordinate + * + * @param x The starting screen x coordinate + * @param y The starting screen y coordinate * @param texts Some {@link DisplayText} to display * @return a {@link SimpleBufferBuilder} that can draw the texts */ @@ -177,5 +178,4 @@ public SimpleBufferBuilder generateVerticesForTexts(int x, int y, SimpleBufferBu } return textBB; } - } diff --git a/gradle.properties b/gradle.properties index 6ceb013fb..0b9911ed1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,5 @@ +gradleutils_version=3.0.0-alpha.11 + mergetool_version=2.0.0 accesstransformers_version=10.0.1 coremods_version=7.0.3 diff --git a/loader/build.gradle b/loader/build.gradle index 0b15c8dc2..71b57ed5c 100644 --- a/loader/build.gradle +++ b/loader/build.gradle @@ -38,3 +38,21 @@ dependencies { testRuntimeOnly("cpw.mods:bootstraplauncher:${bootstraplauncher_version}") } +spotless { + java { + // courtesy of diffplug/spotless#240 + // https://github.com/diffplug/spotless/issues/240#issuecomment-385206606 + custom 'noWildcardImports', { String fileContents -> + if (fileContents.contains('*;\n')) { + throw new GradleException('No wildcard imports are allowed!') + } + } + + custom 'noNotNull', { String fileContents -> + if (fileContents.contains('@NotNull') || fileContents.contains('@Nonnull')) { + throw new GradleException('@NotNull and @Nonnull are disallowed.') + } + } + bumpThisNumberIfACustomStepChanges(1) + } +} diff --git a/loader/src/main/java/net/neoforged/fml/Bindings.java b/loader/src/main/java/net/neoforged/fml/Bindings.java index f64523e91..18e66a480 100644 --- a/loader/src/main/java/net/neoforged/fml/Bindings.java +++ b/loader/src/main/java/net/neoforged/fml/Bindings.java @@ -6,20 +6,19 @@ package net.neoforged.fml; import cpw.mods.modlauncher.util.ServiceLoaderUtils; +import java.util.ServiceLoader; +import java.util.function.Supplier; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.config.IConfigEvent; import net.neoforged.fml.loading.FMLLoader; -import java.util.ServiceLoader; -import java.util.function.Supplier; - public class Bindings { private static final Bindings INSTANCE = new Bindings(); private final IBindingsProvider provider; private Bindings() { - final var providers = ServiceLoaderUtils.streamServiceLoader(()->ServiceLoader.load(FMLLoader.getGameLayer(), IBindingsProvider.class), sce->{}).toList(); + final var providers = ServiceLoaderUtils.streamServiceLoader(() -> ServiceLoader.load(FMLLoader.getGameLayer(), IBindingsProvider.class), sce -> {}).toList(); if (providers.size() != 1) { throw new IllegalStateException("Could not find bindings provider"); } diff --git a/loader/src/main/java/net/neoforged/fml/CrashReportCallables.java b/loader/src/main/java/net/neoforged/fml/CrashReportCallables.java index 1690b06fd..584ce49da 100644 --- a/loader/src/main/java/net/neoforged/fml/CrashReportCallables.java +++ b/loader/src/main/java/net/neoforged/fml/CrashReportCallables.java @@ -6,8 +6,6 @@ package net.neoforged.fml; import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -15,9 +13,9 @@ import java.util.function.BooleanSupplier; import java.util.function.Supplier; import java.util.stream.Stream; +import org.slf4j.Logger; -public class CrashReportCallables -{ +public class CrashReportCallables { private static final Logger LOGGER = LogUtils.getLogger(); private static final List crashCallables = Collections.synchronizedList(new ArrayList<>()); private static final List HEADERS = Collections.synchronizedList(new ArrayList<>()); @@ -25,30 +23,26 @@ public class CrashReportCallables /** * Register a custom {@link ISystemReportExtender} */ - public static void registerCrashCallable(ISystemReportExtender callable) - { + public static void registerCrashCallable(ISystemReportExtender callable) { crashCallables.add(callable); } /** * Register a {@link ISystemReportExtender system report extender} with the given header name and content * generator, which will always be appended to the system report - * @param headerName The name of the system report entry + * + * @param headerName The name of the system report entry * @param reportGenerator The report generator to be called when a crash report is built */ - public static void registerCrashCallable(String headerName, Supplier reportGenerator) - { - registerCrashCallable(new ISystemReportExtender() - { + public static void registerCrashCallable(String headerName, Supplier reportGenerator) { + registerCrashCallable(new ISystemReportExtender() { @Override - public String getLabel() - { + public String getLabel() { return headerName; } @Override - public String get() - { + public String get() { return reportGenerator.get(); } }); @@ -57,35 +51,28 @@ public String get() /** * Register a {@link ISystemReportExtender system report extender} with the given header name and content * generator, which will only be appended to the system report when the given {@link BooleanSupplier} returns true - * @param headerName The name of the system report entry + * + * @param headerName The name of the system report entry * @param reportGenerator The report generator to be called when a crash report is built - * @param active The supplier of the flag to be checked when a crash report is built + * @param active The supplier of the flag to be checked when a crash report is built */ - public static void registerCrashCallable(String headerName, Supplier reportGenerator, BooleanSupplier active) - { - registerCrashCallable(new ISystemReportExtender() - { + public static void registerCrashCallable(String headerName, Supplier reportGenerator, BooleanSupplier active) { + registerCrashCallable(new ISystemReportExtender() { @Override - public String getLabel() - { + public String getLabel() { return headerName; } @Override - public String get() - { + public String get() { return reportGenerator.get(); } @Override - public boolean isActive() - { - try - { + public boolean isActive() { + try { return active.getAsBoolean(); - } - catch (Throwable t) - { + } catch (Throwable t) { LOGGER.warn("CrashCallable '{}' threw an exception while checking the active flag, disabling", headerName, t); return false; } @@ -102,8 +89,7 @@ public static void registerHeader(ICrashReportHeader header) { HEADERS.add(header); } - public static List allCrashCallables() - { + public static List allCrashCallables() { return List.copyOf(crashCallables); } diff --git a/loader/src/main/java/net/neoforged/fml/DeferredWorkQueue.java b/loader/src/main/java/net/neoforged/fml/DeferredWorkQueue.java index d7334c882..47a17cffb 100644 --- a/loader/src/main/java/net/neoforged/fml/DeferredWorkQueue.java +++ b/loader/src/main/java/net/neoforged/fml/DeferredWorkQueue.java @@ -7,6 +7,7 @@ import static net.neoforged.fml.Logging.LOADING; +import com.google.common.base.Stopwatch; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -17,8 +18,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.function.Supplier; - -import com.google.common.base.Stopwatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,8 +32,7 @@ * Exceptions from tasks will be handled gracefully, causing a mod loading * error. Tasks that take egregiously long times to run will be logged. */ -public class DeferredWorkQueue -{ +public class DeferredWorkQueue { private static final Logger LOGGER = LogManager.getLogger(); private static final Map workQueues = new HashMap<>(); @@ -64,8 +62,7 @@ public void runTasks() { LOADING, "Synchronous work queue completed exceptionally in {}, see suppressed exceptions for details:", timer, - aggregate - ); + aggregate); throw aggregate; } else { LOGGER.debug(LOADING, "Synchronous work queue completed in {}", timer); @@ -123,4 +120,4 @@ private TaskInfo(ModContainer owner) { this.owner = owner; } } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/DistExecutor.java b/loader/src/main/java/net/neoforged/fml/DistExecutor.java index 2ec155bf2..7ff285ebf 100644 --- a/loader/src/main/java/net/neoforged/fml/DistExecutor.java +++ b/loader/src/main/java/net/neoforged/fml/DistExecutor.java @@ -5,11 +5,6 @@ package net.neoforged.fml; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.loading.FMLEnvironment; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.io.Serializable; import java.lang.invoke.SerializedLambda; import java.lang.reflect.InvocationTargetException; @@ -17,6 +12,10 @@ import java.util.Objects; import java.util.concurrent.Callable; import java.util.function.Supplier; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.loading.FMLEnvironment; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * Use to execute code conditionally based on sidedness. @@ -29,9 +28,9 @@ * @deprecated Check for {@link FMLEnvironment#dist} instead. */ @Deprecated(forRemoval = true) -public final class DistExecutor -{ +public final class DistExecutor { private static final Logger LOGGER = LogManager.getLogger(); + private DistExecutor() {} /** @@ -43,9 +42,9 @@ private DistExecutor() {} * * Use {@link #safeCallWhenOn(Dist, Supplier)} where possible. * - * @param dist The dist to run on + * @param dist The dist to run on * @param toRun A supplier of the callable to run (Supplier wrapper to ensure classloading only on the appropriate dist) - * @param The return type from the callable + * @param The return type from the callable * @return The callable's result * @deprecated use {@link #safeCallWhenOn(Dist, Supplier)} instead. This remains for advanced use cases. */ @@ -56,12 +55,9 @@ public static T callWhenOn(Dist dist, Supplier> toRun) { public static T unsafeCallWhenOn(Dist dist, Supplier> toRun) { if (dist == FMLEnvironment.dist) { - try - { + try { return toRun.get().call(); - } - catch (Exception e) - { + } catch (Exception e) { throw new RuntimeException(e); } } @@ -73,9 +69,10 @@ public static T unsafeCallWhenOn(Dist dist, Supplier> toRun) { * * The lambda supplied here is required to be a method reference to a method defined in * another class, otherwise an invalid SafeReferent error will be thrown - * @param dist the dist which this will run on + * + * @param dist the dist which this will run on * @param toRun the SafeCallable to run and return the result from - * @param The type of the SafeCallable + * @param The type of the SafeCallable * @return the result of the SafeCallable or null if on the wrong side */ public static T safeCallWhenOn(Dist dist, Supplier> toRun) { @@ -89,7 +86,7 @@ public static T safeCallWhenOn(Dist dist, Supplier> toRun) { * This method can cause unexpected ClassNotFound exceptions. * * @see #callWhenOn(Dist, Supplier) - * @param dist Dist to run this code on + * @param dist Dist to run this code on * @param toRun The code to run * @deprecated use {@link #safeRunWhenOn(Dist, Supplier)} where possible. Advanced uses only. */ @@ -97,6 +94,7 @@ public static T safeCallWhenOn(Dist dist, Supplier> toRun) { public static void runWhenOn(Dist dist, Supplier toRun) { unsafeRunWhenOn(dist, toRun); } + /** * Runs the supplied Runnable on the speicified side. Same warnings apply as {@link #unsafeCallWhenOn(Dist, Supplier)}. * @@ -106,7 +104,7 @@ public static void runWhenOn(Dist dist, Supplier toRun) { * Use {@link #safeRunWhenOn(Dist, Supplier)} if you can. * * @see #unsafeCallWhenOn(Dist, Supplier) - * @param dist Dist to run this code on + * @param dist Dist to run this code on * @param toRun The code to run */ public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { @@ -117,27 +115,29 @@ public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { /** * Call the supplied SafeRunnable when on the correct Dist. - * @param dist The dist to run on + * + * @param dist The dist to run on * @param toRun The code to run */ public static void safeRunWhenOn(Dist dist, Supplier toRun) { validateSafeReferent(toRun); - if (dist == FMLEnvironment.dist) { + if (dist == FMLEnvironment.dist) { toRun.get().run(); } } + /** * Executes one of the two suppliers, based on which side is active. * *

- * Example (replacement for old SidedProxy):
+ * Example (replacement for old SidedProxy):
* {@code Proxy p = DistExecutor.runForDist(()->ClientProxy::new, ()->ServerProxy::new);} * * NOTE: the double supplier is required to avoid classloading the secondary target. * * @param clientTarget The supplier supplier to run when on the {@link Dist#CLIENT} * @param serverTarget The supplier supplier to run when on the {@link Dist#DEDICATED_SERVER} - * @param The common type to return + * @param The common type to return * @return The returned instance * @deprecated Use {@link #safeRunForDist(Supplier, Supplier)} */ @@ -153,12 +153,11 @@ public static T runForDist(Supplier> clientTarget, Supplier The common type to return + * @param The common type to return * @return The returned instance */ public static T unsafeRunForDist(Supplier> clientTarget, Supplier> serverTarget) { - switch (FMLEnvironment.dist) - { + switch (FMLEnvironment.dist) { case CLIENT: return clientTarget.get().get(); case DEDICATED_SERVER: @@ -167,25 +166,25 @@ public static T unsafeRunForDist(Supplier> clientTarget, Supplie throw new IllegalArgumentException("UNSIDED?"); } } + /** * Executes one of the two suppliers, based on which side is active. * *

- * Example (replacement for old SidedProxy):
+ * Example (replacement for old SidedProxy):
* {@code Proxy p = DistExecutor.safeRunForDist(()->ClientProxy::new, ()->ServerProxy::new);} * * NOTE: the double supplier is required to avoid classloading the secondary target. * * @param clientTarget The supplier supplier to run when on the {@link Dist#CLIENT} * @param serverTarget The supplier supplier to run when on the {@link Dist#DEDICATED_SERVER} - * @param The common type to return + * @param The common type to return * @return The returned instance */ public static T safeRunForDist(Supplier> clientTarget, Supplier> serverTarget) { validateSafeReferent(clientTarget); validateSafeReferent(serverTarget); - switch (FMLEnvironment.dist) - { + switch (FMLEnvironment.dist) { case CLIENT: return clientTarget.get().get(); case DEDICATED_SERVER: @@ -218,6 +217,7 @@ public interface SafeReferent {} /** * SafeCallable version of {@link SafeReferent}. + * * @see SafeReferent * @param The return type of the Callable */ @@ -225,6 +225,7 @@ public interface SafeCallable extends SafeReferent, Callable, Serializable /** * SafeSupplier version of {@link SafeReferent} + * * @param The return type of the Supplier */ public interface SafeSupplier extends SafeReferent, Supplier, Serializable {} @@ -253,11 +254,10 @@ private static final void validateSafeReferent(Supplier break;// custom interface implementation SerializedLambda l = (SerializedLambda) replacement; if (Objects.equals(l.getCapturingClass(), l.getImplClass())) { - LOGGER.fatal("Detected unsafe referent usage, please view the code at {}",Thread.currentThread().getStackTrace()[3]); + LOGGER.fatal("Detected unsafe referent usage, please view the code at {}", Thread.currentThread().getStackTrace()[3]); throw new RuntimeException("Unsafe Referent usage found in safe referent method"); } - } catch (NoSuchMethodException e) { - } catch (IllegalAccessException | InvocationTargetException e) { + } catch (NoSuchMethodException e) {} catch (IllegalAccessException | InvocationTargetException e) { break; } } diff --git a/loader/src/main/java/net/neoforged/fml/I18NParser.java b/loader/src/main/java/net/neoforged/fml/I18NParser.java index 96cf10f50..ca1c3a02a 100644 --- a/loader/src/main/java/net/neoforged/fml/I18NParser.java +++ b/loader/src/main/java/net/neoforged/fml/I18NParser.java @@ -7,5 +7,6 @@ public interface I18NParser { String parseMessage(String i18nMessage, Object... args); + String stripControlCodes(String toStrip); } diff --git a/loader/src/main/java/net/neoforged/fml/IBindingsProvider.java b/loader/src/main/java/net/neoforged/fml/IBindingsProvider.java index 31cfa677c..ff48ff490 100644 --- a/loader/src/main/java/net/neoforged/fml/IBindingsProvider.java +++ b/loader/src/main/java/net/neoforged/fml/IBindingsProvider.java @@ -5,13 +5,14 @@ package net.neoforged.fml; +import java.util.function.Supplier; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.config.IConfigEvent; -import java.util.function.Supplier; - public interface IBindingsProvider { Supplier getForgeBusSupplier(); + Supplier getMessageParser(); + Supplier getConfigConfiguration(); } diff --git a/loader/src/main/java/net/neoforged/fml/ICrashReportHeader.java b/loader/src/main/java/net/neoforged/fml/ICrashReportHeader.java index 75158c0c7..89ebe2946 100644 --- a/loader/src/main/java/net/neoforged/fml/ICrashReportHeader.java +++ b/loader/src/main/java/net/neoforged/fml/ICrashReportHeader.java @@ -9,6 +9,7 @@ /** * Supplies a header to add to crash reports. + * * @see CrashReportCallables#registerHeader(ICrashReportHeader) */ @FunctionalInterface diff --git a/loader/src/main/java/net/neoforged/fml/IExtensionPoint.java b/loader/src/main/java/net/neoforged/fml/IExtensionPoint.java index 2d14ffc7f..a80e2ea8a 100644 --- a/loader/src/main/java/net/neoforged/fml/IExtensionPoint.java +++ b/loader/src/main/java/net/neoforged/fml/IExtensionPoint.java @@ -5,7 +5,6 @@ package net.neoforged.fml; -import java.util.function.BiPredicate; import java.util.function.Supplier; /** @@ -16,6 +15,4 @@ * supply an arbitrary value to another mod or framework through their mod container class, avoiding * the use of {@link InterModComms} or other external frameworks to pass around these values.

*/ -public interface IExtensionPoint -{ -} +public interface IExtensionPoint {} diff --git a/loader/src/main/java/net/neoforged/fml/IModLoadingState.java b/loader/src/main/java/net/neoforged/fml/IModLoadingState.java index f774f5720..d8483e050 100644 --- a/loader/src/main/java/net/neoforged/fml/IModLoadingState.java +++ b/loader/src/main/java/net/neoforged/fml/IModLoadingState.java @@ -5,16 +5,15 @@ package net.neoforged.fml; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; -import net.neoforged.fml.loading.progress.ProgressMeter; - import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.ToIntFunction; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.fml.loading.progress.ProgressMeter; /** * A mod loading state. During mod loading, the mod loader transitions between states in a defined sorted list of states, @@ -48,12 +47,13 @@ public interface IModLoadingState { /** * @return a function that computes the size of this transition based on the size of the modlist. - * Used to compute progress. + * Used to compute progress. */ ToIntFunction size(); /** * {@return an optional runnable, which runs before starting the transition from this state to the next} + * * @see #buildTransition(Executor, Executor, ProgressMeter, Function, Function) */ Optional> inlineRunnable(); @@ -68,10 +68,9 @@ public interface IModLoadingState { * @return a transition task for this state * @see #buildTransition(Executor, Executor, ProgressMeter, Function, Function) */ - default - Optional> buildTransition(final Executor syncExecutor, - final Executor parallelExecutor, - final ProgressMeter progressBar) { + default Optional> buildTransition(final Executor syncExecutor, + final Executor parallelExecutor, + final ProgressMeter progressBar) { return buildTransition(syncExecutor, parallelExecutor, progressBar, e -> CompletableFuture.runAsync(() -> {}, e), e -> CompletableFuture.runAsync(() -> {}, e)); @@ -89,10 +88,9 @@ Optional> buildTransition(final Executor syncExecutor, * @param postSyncTask a function which returns a task to run after event post-dispatch hook * @return a transition task for this state */ - - Optional> buildTransition(final Executor syncExecutor, - final Executor parallelExecutor, - final ProgressMeter progressBar, - final Function> preSyncTask, - final Function> postSyncTask); + Optional> buildTransition(final Executor syncExecutor, + final Executor parallelExecutor, + final ProgressMeter progressBar, + final Function> preSyncTask, + final Function> postSyncTask); } diff --git a/loader/src/main/java/net/neoforged/fml/IModStateTransition.java b/loader/src/main/java/net/neoforged/fml/IModStateTransition.java index 3950c1665..fe9583bbb 100644 --- a/loader/src/main/java/net/neoforged/fml/IModStateTransition.java +++ b/loader/src/main/java/net/neoforged/fml/IModStateTransition.java @@ -5,10 +5,6 @@ package net.neoforged.fml; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; -import net.neoforged.fml.loading.progress.ProgressMeter; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -17,6 +13,9 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.fml.loading.progress.ProgressMeter; @SuppressWarnings("unchecked") public interface IModStateTransition { @@ -24,13 +23,12 @@ static IModStateTransition buildNoopTransition() { return new NoopTransition(); } - default - CompletableFuture build(final String name, - final Executor syncExecutor, - final Executor parallelExecutor, - final ProgressMeter progressBar, - final Function> preSyncTask, - final Function> postSyncTask) { + default CompletableFuture build(final String name, + final Executor syncExecutor, + final Executor parallelExecutor, + final ProgressMeter progressBar, + final Function> preSyncTask, + final Function> postSyncTask) { List> futures = new ArrayList<>(); this.eventFunctionStream().get() @@ -42,7 +40,7 @@ CompletableFuture build(final String name, final CompletableFuture eventDispatchCF = ModList.gather(futures).thenCompose(ModList::completableFutureFromExceptionList); final CompletableFuture postEventDispatchCF = preSyncTaskCF .thenApplyAsync(n -> { - progressBar.label(progressBar.name() + ": dispatching "+name); + progressBar.label(progressBar.name() + ": dispatching " + name); return null; }, parallelExecutor) .thenComposeAsync(n -> eventDispatchCF, parallelExecutor) @@ -57,14 +55,13 @@ default BiFunction nextModLoadingSt return ModLoadingStage::nextState; } - private - EventGenerator addCompletableFutureTaskForModDispatch(final Executor syncExecutor, - final Executor parallelExecutor, - final List> completableFutures, - final ProgressMeter progressBar, - final EventGenerator eventGenerator, - final BiFunction nextState, - final EventGenerator nextGenerator) { + private EventGenerator addCompletableFutureTaskForModDispatch(final Executor syncExecutor, + final Executor parallelExecutor, + final List> completableFutures, + final ProgressMeter progressBar, + final EventGenerator eventGenerator, + final BiFunction nextState, + final EventGenerator nextGenerator) { final Executor selectedExecutor = threadSelector().apply(syncExecutor, parallelExecutor); var preDispatchHook = (BiFunction, CompletableFuture>) preDispatchHook(); @@ -79,9 +76,13 @@ EventGenerator addCompletableFutureTaskForModDispatch(final Executor syncExec } Supplier>> eventFunctionStream(); + ThreadSelector threadSelector(); + BiFunction, CompletableFuture> finalActivityGenerator(); + BiFunction, CompletableFuture> preDispatchHook(); + BiFunction, CompletableFuture> postDispatchHook(); interface EventGenerator extends Function { @@ -92,7 +93,6 @@ static EventGenerator fromFunction(Functio } record NoopTransition() implements IModStateTransition { - @Override public Supplier>> eventFunctionStream() { return Stream::of; @@ -110,11 +110,11 @@ public BiFunction, CompletableFuture> fi @Override public BiFunction, CompletableFuture> preDispatchHook() { - return (t, f)-> CompletableFuture.completedFuture(null); + return (t, f) -> CompletableFuture.completedFuture(null); } @Override public BiFunction, CompletableFuture> postDispatchHook() { - return (t, f)-> CompletableFuture.completedFuture(null); + return (t, f) -> CompletableFuture.completedFuture(null); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/ISystemReportExtender.java b/loader/src/main/java/net/neoforged/fml/ISystemReportExtender.java index b89edd400..80d5297c9 100644 --- a/loader/src/main/java/net/neoforged/fml/ISystemReportExtender.java +++ b/loader/src/main/java/net/neoforged/fml/ISystemReportExtender.java @@ -5,13 +5,11 @@ package net.neoforged.fml; -import org.jetbrains.annotations.ApiStatus; - import java.util.function.Supplier; +import org.jetbrains.annotations.ApiStatus; @ApiStatus.OverrideOnly -public interface ISystemReportExtender extends Supplier -{ +public interface ISystemReportExtender extends Supplier { String getLabel(); default boolean isActive() { diff --git a/loader/src/main/java/net/neoforged/fml/InterModComms.java b/loader/src/main/java/net/neoforged/fml/InterModComms.java index 3f51a54a8..a85483600 100644 --- a/loader/src/main/java/net/neoforged/fml/InterModComms.java +++ b/loader/src/main/java/net/neoforged/fml/InterModComms.java @@ -5,7 +5,6 @@ package net.neoforged.fml; - import java.util.Iterator; import java.util.Spliterator; import java.util.concurrent.ConcurrentHashMap; @@ -17,14 +16,13 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -public class InterModComms -{ +public class InterModComms { public record IMCMessage(String senderModId, String modId, String method, Supplier messageSupplier) { - /** * Deprecated: use {@link #senderModId()} + * * @return The modid of the sender. This is supplied by the caller, or by the active mod container context. - * Consider it unreliable. + * Consider it unreliable. */ @Deprecated public final String getSenderModId() { @@ -33,6 +31,7 @@ public final String getSenderModId() { /** * Deprecated: use {@link #modId()} + * * @return The modid being sent to. */ @Deprecated @@ -42,6 +41,7 @@ public final String getModId() { /** * Deprecated: use {@link #method()} + * * @return The method being sent to. */ @Deprecated @@ -52,7 +52,7 @@ public final String getMethod() { /** * @param The type of the message. * @return A {@link Supplier} of the message. - * Use {@link #messageSupplier()} + * Use {@link #messageSupplier()} */ @SuppressWarnings("unchecked") @Deprecated @@ -66,14 +66,14 @@ public final Supplier getMessageSupplier() { /** * Send IMC to remote. Sender will default to the active modcontainer, or minecraft if not. * - * @param modId the mod id to send to + * @param modId the mod id to send to * @param method the method name to send - * @param thing the thing associated with the method name + * @param thing the thing associated with the method name * @return true if the message was enqueued for sending (the target modid is loaded) */ public static boolean sendTo(final String modId, final String method, final Supplier thing) { if (!ModList.get().isLoaded(modId)) return false; - containerQueues.computeIfAbsent(modId, k->new ConcurrentLinkedQueue<>()).add(new IMCMessage(ModLoadingContext.get().getActiveContainer().getModId(), modId, method, thing)); + containerQueues.computeIfAbsent(modId, k -> new ConcurrentLinkedQueue<>()).add(new IMCMessage(ModLoadingContext.get().getActiveContainer().getModId(), modId, method, thing)); return true; } @@ -81,21 +81,21 @@ public static boolean sendTo(final String modId, final String method, final Supp * Send IMC to remote. * * @param senderModId the mod id you are sending from - * @param modId the mod id to send to - * @param method the method name to send - * @param thing the thing associated with the method name + * @param modId the mod id to send to + * @param method the method name to send + * @param thing the thing associated with the method name * @return true if the message was enqueued for sending (the target modid is loaded) */ public static boolean sendTo(final String senderModId, final String modId, final String method, final Supplier thing) { if (!ModList.get().isLoaded(modId)) return false; - containerQueues.computeIfAbsent(modId, k->new ConcurrentLinkedQueue<>()).add(new IMCMessage(senderModId, modId, method, thing)); + containerQueues.computeIfAbsent(modId, k -> new ConcurrentLinkedQueue<>()).add(new IMCMessage(senderModId, modId, method, thing)); return true; } /** * Retrieve pending messages for your modid. Use the predicate to filter the method name. * - * @param modId the modid you are querying for + * @param modId the modid you are querying for * @param methodMatcher a predicate for the method you are interested in * @return All messages passing the supplied method predicate */ @@ -112,11 +112,10 @@ public static Stream getMessages(final String modId, final Predicate * @return All messages */ public static Stream getMessages(final String modId) { - return getMessages(modId, s->Boolean.TRUE); + return getMessages(modId, s -> Boolean.TRUE); } - private static class QueueFilteringSpliterator implements Spliterator - { + private static class QueueFilteringSpliterator implements Spliterator { private final ConcurrentLinkedQueue queue; private final Predicate methodFilter; private final Iterator iterator; @@ -138,18 +137,14 @@ public long estimateSize() { } @Override - public boolean tryAdvance(final Consumer action) - { + public boolean tryAdvance(final Consumer action) { IMCMessage next; - do - { - if (!iterator.hasNext()) - { + do { + if (!iterator.hasNext()) { return false; } next = this.iterator.next(); - } - while (!methodFilter.test(next.method)); + } while (!methodFilter.test(next.method)); action.accept(next); this.iterator.remove(); return true; @@ -159,6 +154,5 @@ public boolean tryAdvance(final Consumer action) public Spliterator trySplit() { return null; } - } } diff --git a/loader/src/main/java/net/neoforged/fml/Logging.java b/loader/src/main/java/net/neoforged/fml/Logging.java index 72b6a2aad..82c846001 100644 --- a/loader/src/main/java/net/neoforged/fml/Logging.java +++ b/loader/src/main/java/net/neoforged/fml/Logging.java @@ -8,8 +8,7 @@ import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -public class Logging -{ +public class Logging { // Lots of markers public static final Marker CORE = MarkerManager.getMarker("CORE"); public static final Marker LOADING = MarkerManager.getMarker("LOADING"); @@ -21,5 +20,4 @@ public class Logging // --log CORE:+DEBUG,SCAN:-OFF // forge log debug 5 - } diff --git a/loader/src/main/java/net/neoforged/fml/LogicalSide.java b/loader/src/main/java/net/neoforged/fml/LogicalSide.java index baa039346..b5ecb4599 100644 --- a/loader/src/main/java/net/neoforged/fml/LogicalSide.java +++ b/loader/src/main/java/net/neoforged/fml/LogicalSide.java @@ -16,8 +16,7 @@ * * @see Dist */ -public enum LogicalSide -{ +public enum LogicalSide { /** * The logical client of the Minecraft game, which interfaces with the player's inputs and renders the player's * viewpoint. @@ -41,16 +40,14 @@ public enum LogicalSide /** * {@return if this logical side is the server} */ - public boolean isServer() - { + public boolean isServer() { return !isClient(); } /** * {@return if the logical side is the client} */ - public boolean isClient() - { + public boolean isClient() { return this == CLIENT; } } diff --git a/loader/src/main/java/net/neoforged/fml/ModContainer.java b/loader/src/main/java/net/neoforged/fml/ModContainer.java index 743c8ed23..3b0a8782b 100644 --- a/loader/src/main/java/net/neoforged/fml/ModContainer.java +++ b/loader/src/main/java/net/neoforged/fml/ModContainer.java @@ -5,6 +5,17 @@ package net.neoforged.fml; +import static net.neoforged.fml.Logging.LOADING; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.BiFunction; +import java.util.function.Supplier; import net.neoforged.bus.api.BusBuilder; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; @@ -18,18 +29,6 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.function.BiFunction; -import java.util.function.Supplier; - -import static net.neoforged.fml.Logging.LOADING; - /** * The container that wraps around mods in the system. *

@@ -43,8 +42,7 @@ * */ -public abstract class ModContainer -{ +public abstract class ModContainer { private static final Logger LOGGER = LogManager.getLogger(); protected final String modId; @@ -56,8 +54,7 @@ public abstract class ModContainer protected final Map, Supplier> extensionPoints = new IdentityHashMap<>(); protected final EnumMap configs = new EnumMap<>(ModConfig.Type.class); - public ModContainer(IModInfo info) - { + public ModContainer(IModInfo info) { this.modId = info.getModId(); // TODO: Currently not reading namespace from configuration.. this.namespace = this.modId; @@ -68,34 +65,31 @@ public ModContainer(IModInfo info) /** * Errored container state, used for filtering. Does nothing. */ - ModContainer() - { + ModContainer() { this.modLoadingStage = ModLoadingStage.ERROR; modId = "BROKEN"; namespace = "BROKEN"; modInfo = null; } + /** * @return the modid for this mod */ - public final String getModId() - { + public final String getModId() { return modId; } /** * @return the resource prefix for the mod */ - public final String getNamespace() - { + public final String getNamespace() { return namespace; } /** * @return The current loading stage for this mod */ - public ModLoadingStage getCurrentState() - { + public ModLoadingStage getCurrentState() { return modLoadingStage; } @@ -108,7 +102,7 @@ public static CompletableFuture buildTran return CompletableFuture .runAsync(() -> { ModLoadingContext.get().setActiveContainer(target); - target.activityMap.getOrDefault(target.modLoadingStage, ()->{}).run(); + target.activityMap.getOrDefault(target.modLoadingStage, () -> {}).run(); target.acceptEvent(eventGenerator.apply(target)); }, executor) .whenComplete((mc, exception) -> { @@ -118,14 +112,13 @@ public static CompletableFuture buildTran }); } - public IModInfo getModInfo() - { + public IModInfo getModInfo() { return modInfo; } @SuppressWarnings("unchecked") public Optional getCustomExtension(Class point) { - return Optional.ofNullable((T)extensionPoints.getOrDefault(point,()-> null).get()); + return Optional.ofNullable((T) extensionPoints.getOrDefault(point, () -> null).get()); } /** @@ -144,18 +137,18 @@ public void registerExtensionPoint(Class point, S } public void addConfig(final ModConfig modConfig) { - configs.put(modConfig.getType(), modConfig); + configs.put(modConfig.getType(), modConfig); } /** * Adds a {@link ModConfig} with the given type and spec. An empty config spec will be ignored and a debug line will * be logged. - * @param type The type of config + * + * @param type The type of config * @param configSpec A config spec */ public void registerConfig(ModConfig.Type type, IConfigSpec configSpec) { - if (configSpec.isEmpty()) - { + if (configSpec.isEmpty()) { // This handles the case where a mod tries to register a config, without any options configured inside it. LOGGER.debug("Attempted to register an empty config for type {} on mod {}", type, modId); return; @@ -167,12 +160,12 @@ public void registerConfig(ModConfig.Type type, IConfigSpec configSpec) { /** * Adds a {@link ModConfig} with the given type, spec, and overridden file name. An empty config spec will be * ignored and a debug line will be logged. - * @param type The type of config + * + * @param type The type of config * @param configSpec A config spec */ public void registerConfig(ModConfig.Type type, IConfigSpec configSpec, String fileName) { - if (configSpec.isEmpty()) - { + if (configSpec.isEmpty()) { // This handles the case where a mod tries to register a config, without any options configured inside it. LOGGER.debug("Attempted to register an empty config for type {} on mod {} using file name {}", type, modId, fileName); return; @@ -200,13 +193,14 @@ public void registerConfig(ModConfig.Type type, IConfigSpec configSpec, Strin *

Not all mods have an event bus! * * @implNote For custom mod container implementations, the event bus must be built with - * {@link BusBuilder#allowPerPhasePost()} or posting via {@link #acceptEvent(EventPriority, Event)} will throw! + * {@link BusBuilder#allowPerPhasePost()} or posting via {@link #acceptEvent(EventPriority, Event)} will throw! */ @Nullable public abstract IEventBus getEventBus(); /** * Accept an arbitrary event for processing by the mod. Posted to {@link #getEventBus()}. + * * @param e Event to accept */ protected final void acceptEvent(T e) { @@ -218,13 +212,14 @@ protected final void acceptEvent(T e) { bus.post(e); LOGGER.trace(LOADING, "Fired event for modid {} : {}", this.getModId(), e); } catch (Throwable t) { - LOGGER.error(LOADING,"Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); + LOGGER.error(LOADING, "Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); throw new ModLoadingException(modInfo, modLoadingStage, "fml.modloading.errorduringevent", t); } } /** * Accept an arbitrary event for processing by the mod. Posted to {@link #getEventBus()}. + * * @param e Event to accept */ protected final void acceptEvent(EventPriority phase, T e) { @@ -236,7 +231,7 @@ protected final void acceptEvent(EventPriority bus.post(phase, e); LOGGER.trace(LOADING, "Fired event for phase {} for modid {} : {}", phase, this.getModId(), e); } catch (Throwable t) { - LOGGER.error(LOADING,"Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); + LOGGER.error(LOADING, "Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); throw new ModLoadingException(modInfo, modLoadingStage, "fml.modloading.errorduringevent", t); } } diff --git a/loader/src/main/java/net/neoforged/fml/ModList.java b/loader/src/main/java/net/neoforged/fml/ModList.java index e2d416fc5..603e99848 100644 --- a/loader/src/main/java/net/neoforged/fml/ModList.java +++ b/loader/src/main/java/net/neoforged/fml/ModList.java @@ -5,19 +5,6 @@ package net.neoforged.fml; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; -import net.neoforged.fml.loading.progress.ProgressMeter; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.language.ModFileScanData; -import net.neoforged.fml.loading.moddiscovery.ModFile; -import net.neoforged.fml.loading.moddiscovery.ModFileInfo; -import net.neoforged.fml.loading.moddiscovery.ModInfo; -import net.neoforged.neoforgespi.locating.IModFile; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; @@ -40,13 +27,24 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.fml.loading.moddiscovery.ModFileInfo; +import net.neoforged.fml.loading.moddiscovery.ModInfo; +import net.neoforged.fml.loading.progress.ProgressMeter; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.ModFileScanData; +import net.neoforged.neoforgespi.locating.IModFile; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * Master list of all mods - game-side version. This is classloaded in the game scope and * can dispatch game level events as a result. */ -public class ModList -{ +public class ModList { private static Logger LOGGER = LogManager.getLogger(); private static ModList INSTANCE; private final List modFiles; @@ -57,15 +55,10 @@ public class ModList private List modFileScanData; private List sortedContainers; - private ModList(final List modFiles, final List sortedList) - { + private ModList(final List modFiles, final List sortedList) { this.modFiles = modFiles.stream().map(ModFile::getModFileInfo).map(ModFileInfo.class::cast).collect(Collectors.toList()); - this.sortedList = sortedList.stream(). - map(ModInfo.class::cast). - collect(Collectors.toList()); - this.fileById = this.modFiles.stream().map(IModFileInfo::getMods).flatMap(Collection::stream). - map(ModInfo.class::cast). - collect(Collectors.toMap(ModInfo::getModId, ModInfo::getOwningFile)); + this.sortedList = sortedList.stream().map(ModInfo.class::cast).collect(Collectors.toList()); + this.fileById = this.modFiles.stream().map(IModFileInfo::getMods).flatMap(Collection::stream).map(ModInfo.class::cast).collect(Collectors.toMap(ModInfo::getModId, ModInfo::getOwningFile)); CrashReportCallables.registerCrashCallable("Mod List", this::crashReport); } @@ -79,14 +72,14 @@ private String fileToLine(IModFile mf) { mf.getModInfos().get(0).getModId(), mf.getModInfos().get(0).getVersion(), getModContainerState(mf.getModInfos().get(0).getModId()), - ((ModFileInfo)mf.getModFileInfo()).getCodeSigningFingerprint().orElse("NOSIGNATURE")); + ((ModFileInfo) mf.getModFileInfo()).getCodeSigningFingerprint().orElse("NOSIGNATURE")); } + private String crashReport() { - return "\n"+applyForEachModFile(this::fileToLine).collect(Collectors.joining("\n\t\t", "\t\t", "")); + return "\n" + applyForEachModFile(this::fileToLine).collect(Collectors.joining("\n\t\t", "\t\t", "")); } - public static ModList of(List modFiles, List sortedList) - { + public static ModList of(List modFiles, List sortedList) { INSTANCE = new ModList(modFiles, sortedList); return INSTANCE; } @@ -103,13 +96,11 @@ private static ForkJoinWorkerThread newForkJoinWorkerThread(ForkJoinPool pool) { return thread; } - public List getModFiles() - { + public List getModFiles() { return modFiles; } - public IModFileInfo getModFileById(String modid) - { + public IModFileInfo getModFileById(String modid) { return this.fileById.get(modid); } @@ -119,12 +110,13 @@ Function> fut final BiFunction stateChange) { return executor -> gather( this.mods.stream() - .map(mod -> ModContainer.buildTransitionHandler(mod, eventGenerator, progressBar, stateChange, executor)) - .collect(Collectors.toList())) - .thenComposeAsync(ModList::completableFutureFromExceptionList, executor); + .map(mod -> ModContainer.buildTransitionHandler(mod, eventGenerator, progressBar, stateChange, executor)) + .collect(Collectors.toList())) + .thenComposeAsync(ModList::completableFutureFromExceptionList, executor); } + static CompletionStage completableFutureFromExceptionList(List> t) { - if (t.stream().noneMatch(e->e.getValue()!=null)) { + if (t.stream().noneMatch(e -> e.getValue() != null)) { return CompletableFuture.completedFuture(null); } else { final List throwables = t.stream().filter(e -> e.getValue() != null).map(Map.Entry::getValue).collect(Collectors.toList()); @@ -135,7 +127,7 @@ static CompletionStage completableFutureFromExceptionList(List CompletableFuture>> gather(List list.set(i, new AbstractMap.SimpleImmutableEntry<>(result, exception))); }); - return CompletableFuture.allOf(results).handle((r, th)->null).thenApply(res -> list); + return CompletableFuture.allOf(results).handle((r, th) -> null).thenApply(res -> list); } - void setLoadedMods(final List modContainers) - { + void setLoadedMods(final List modContainers) { this.mods = modContainers; - this.sortedContainers = modContainers.stream().sorted(Comparator.comparingInt(c->sortedList.indexOf(c.getModInfo()))).toList(); + this.sortedContainers = modContainers.stream().sorted(Comparator.comparingInt(c -> sortedList.indexOf(c.getModInfo()))).toList(); this.indexedMods = modContainers.stream().collect(Collectors.toMap(ModContainer::getModId, Function.identity())); } @SuppressWarnings("unchecked") - public Optional getModObjectById(String modId) - { + public Optional getModObjectById(String modId) { return getModContainerById(modId).map(ModContainer::getMod).map(o -> (T) o); } - public Optional getModContainerById(String modId) - { + public Optional getModContainerById(String modId) { return Optional.ofNullable(this.indexedMods.get(modId)); } - public Optional getModContainerByObject(Object obj) - { + public Optional getModContainerByObject(Object obj) { return mods.stream().filter(mc -> mc.getMod() == obj).findFirst(); } - public List getMods() - { + public List getMods() { return this.sortedList; } - public boolean isLoaded(String modTarget) - { + public boolean isLoaded(String modTarget) { return this.indexedMods.containsKey(modTarget); } - public int size() - { + public int size() { return mods.size(); } - public List getAllScanData() - { - if (modFileScanData == null) - { - modFileScanData = this.sortedList.stream(). - map(IModInfo::getOwningFile). - filter(Objects::nonNull). - map(IModFileInfo::getFile). - distinct(). - map(IModFile::getScanResult). - collect(Collectors.toList()); + public List getAllScanData() { + if (modFileScanData == null) { + modFileScanData = this.sortedList.stream().map(IModInfo::getOwningFile).filter(Objects::nonNull).map(IModFileInfo::getFile).distinct().map(IModFile::getScanResult).collect(Collectors.toList()); } return modFileScanData; - } - public void forEachModFile(Consumer fileConsumer) - { + public void forEachModFile(Consumer fileConsumer) { modFiles.stream().map(IModFileInfo::getFile).forEach(fileConsumer); } diff --git a/loader/src/main/java/net/neoforged/fml/ModLoader.java b/loader/src/main/java/net/neoforged/fml/ModLoader.java index b557725bf..80f6981ce 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoader.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoader.java @@ -5,7 +5,27 @@ package net.neoforged.fml; +import static net.neoforged.fml.Logging.CORE; +import static net.neoforged.fml.Logging.LOADING; + import com.google.common.collect.ImmutableList; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.Executor; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; @@ -28,18 +48,6 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionException; -import java.util.concurrent.Executor; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static net.neoforged.fml.Logging.CORE; -import static net.neoforged.fml.Logging.LOADING; - /** * Loads mods. * @@ -47,37 +55,36 @@ * * Overall sequence for loadMods is: *

- *
CONSTRUCT
- *
Constructs the mod instance. Mods can typically setup basic environment such as Event listeners - * and Configuration specifications here.
- *
Automated dispatches
- *
Dispatches automated elements : {@code net.neoforged.fml.common.Mod.EventBusSubscriber}, - * {@code net.neoforged.event.RegistryEvent}, {@code net.neoforged.common.capabilities.CapabilityInject} - * and others
- *
CONFIG_LOAD
- *
Dispatches ConfigLoadEvent to mods
- *
COMMON_SETUP
- *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent} to mods
- *
SIDED_SETUP
- *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLClientSetupEvent} or - * {@code net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent} to mods
+ *
CONSTRUCT
+ *
Constructs the mod instance. Mods can typically setup basic environment such as Event listeners + * and Configuration specifications here.
+ *
Automated dispatches
+ *
Dispatches automated elements : {@code net.neoforged.fml.common.Mod.EventBusSubscriber}, + * {@code net.neoforged.event.RegistryEvent}, {@code net.neoforged.common.capabilities.CapabilityInject} + * and others
+ *
CONFIG_LOAD
+ *
Dispatches ConfigLoadEvent to mods
+ *
COMMON_SETUP
+ *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent} to mods
+ *
SIDED_SETUP
+ *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLClientSetupEvent} or + * {@code net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent} to mods
*
* * Overall sequence for finishMods is: *
- *
ENQUEUE_IMC
- *
Dispatches {@code net.neoforged.fml.event.lifecycle.InterModEnqueueEvent} to mods, - * for enqueuing {@link InterModComms} messages for other mods to receive subsequently
- *
PROCESS_IMC
- *
Dispatches {@code net.neoforged.fml.event.lifecycle.InterModProcessEvent} to mods, - * for processing {@link InterModComms} messages received from other mods prior to this event
- *
COMPLETE
- *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent} to mods, - * and completes the mod loading sequence.
+ *
ENQUEUE_IMC
+ *
Dispatches {@code net.neoforged.fml.event.lifecycle.InterModEnqueueEvent} to mods, + * for enqueuing {@link InterModComms} messages for other mods to receive subsequently
+ *
PROCESS_IMC
+ *
Dispatches {@code net.neoforged.fml.event.lifecycle.InterModProcessEvent} to mods, + * for processing {@link InterModComms} messages received from other mods prior to this event
+ *
COMPLETE
+ *
Dispatches {@code net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent} to mods, + * and completes the mod loading sequence.
*
*/ -public class ModLoader -{ +public class ModLoader { private static final Logger LOGGER = LogManager.getLogger(); private static ModLoader INSTANCE; private final LoadingModList loadingModList; @@ -91,8 +98,7 @@ public class ModLoader private final Set completedStates = new HashSet<>(); private ModList modList; - private ModLoader() - { + private ModLoader() { INSTANCE = this; this.loadingModList = FMLLoader.getLoadingModList(); this.loadingExceptions = FMLLoader.getLoadingModList().getErrors().stream() @@ -119,28 +125,27 @@ private ModLoader() } private String computeLanguageList() { - return "\n"+FMLLoader.getLanguageLoadingProvider().applyForEach(lp->lp.name() +"@"+ lp.getClass().getPackage().getImplementationVersion()).collect(Collectors.joining("\n\t\t", "\t\t", "")); + return "\n" + FMLLoader.getLanguageLoadingProvider().applyForEach(lp -> lp.name() + "@" + lp.getClass().getPackage().getImplementationVersion()).collect(Collectors.joining("\n\t\t", "\t\t", "")); } private String computeModLauncherServiceList() { final List> mods = FMLLoader.modLauncherModList(); - return "\n"+mods.stream().map(mod->mod.getOrDefault("file","nofile")+ - " "+mod.getOrDefault("name", "missing")+ - " "+mod.getOrDefault("type","NOTYPE")+ - " "+mod.getOrDefault("description", "")). - collect(Collectors.joining("\n\t\t","\t\t","")); + return "\n" + mods.stream().map(mod -> mod.getOrDefault("file", "nofile") + + " " + mod.getOrDefault("name", "missing") + + " " + mod.getOrDefault("type", "NOTYPE") + + " " + mod.getOrDefault("description", "")).collect(Collectors.joining("\n\t\t", "\t\t", "")); } - public static ModLoader get() - { + public static ModLoader get() { return INSTANCE == null ? INSTANCE = new ModLoader() : INSTANCE; } /** * Run on the primary starting thread by ClientModLoader and ServerModLoader - * @param syncExecutor An executor to run tasks on the main thread + * + * @param syncExecutor An executor to run tasks on the main thread * @param parallelExecutor An executor to run tasks on a parallel loading thread pool - * @param periodicTask Optional periodic task to perform on the main thread while other activities run + * @param periodicTask Optional periodic task to perform on the main thread while other activities run */ public void gatherAndInitializeMods(final ModWorkManager.DrivenExecutor syncExecutor, final Executor parallelExecutor, final Runnable periodicTask) { ForgeFeature.registerFeature("javaVersion", ForgeFeature.VersionFeatureTest.forVersionString(IModInfo.DependencySide.BOTH, System.getProperty("java.version"))); @@ -151,7 +156,7 @@ public void gatherAndInitializeMods(final ModWorkManager.DrivenExecutor syncExec loadingModList.getMods()); if (!this.loadingExceptions.isEmpty()) { LOGGER.fatal(CORE, "Error during pre-loading phase", loadingExceptions.get(0)); - statusConsumer.ifPresent(c->c.accept("ERROR DURING MOD LOADING")); + statusConsumer.ifPresent(c -> c.accept("ERROR DURING MOD LOADING")); modList.setLoadedMods(Collections.emptyList()); loadingStateValid = false; throw new LoadingFailedException(loadingExceptions); @@ -164,7 +169,7 @@ public void gatherAndInitializeMods(final ModWorkManager.DrivenExecutor syncExec if (!failedBounds.isEmpty()) { LOGGER.fatal(CORE, "Failed to validate feature bounds for mods: {}", failedBounds); - statusConsumer.ifPresent(c->c.accept("ERROR DURING MOD LOADING")); + statusConsumer.ifPresent(c -> c.accept("ERROR DURING MOD LOADING")); modList.setLoadedMods(Collections.emptyList()); loadingStateValid = false; throw new LoadingFailedException(failedBounds.stream() @@ -179,7 +184,7 @@ public void gatherAndInitializeMods(final ModWorkManager.DrivenExecutor syncExec .toList(); if (!loadingExceptions.isEmpty()) { LOGGER.fatal(CORE, "Failed to initialize mod containers", loadingExceptions.get(0)); - statusConsumer.ifPresent(c->c.accept("ERROR DURING MOD LOADING")); + statusConsumer.ifPresent(c -> c.accept("ERROR DURING MOD LOADING")); modList.setLoadedMods(Collections.emptyList()); loadingStateValid = false; throw new LoadingFailedException(loadingExceptions); @@ -188,22 +193,22 @@ public void gatherAndInitializeMods(final ModWorkManager.DrivenExecutor syncExec this.modList = modList; var stateList = stateManager.getStates(ModLoadingPhase.GATHER); var progress = StartupMessageManager.addProgressBar("Mod Gather", stateList.stream().mapToInt(mls -> mls.size().applyAsInt(modList)).sum()); - stateList.forEach(mls->dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); + stateList.forEach(mls -> dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); progress.complete(); } public void loadMods(final ModWorkManager.DrivenExecutor syncExecutor, final Executor parallelExecutor, final Runnable periodicTask) { var stateList = stateManager.getStates(ModLoadingPhase.LOAD); var progress = StartupMessageManager.addProgressBar("Mod Loading", stateList.stream().mapToInt(mls -> mls.size().applyAsInt(modList)).sum()); - stateList.forEach(mls->dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); + stateList.forEach(mls -> dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); progress.complete(); } public void finishMods(final ModWorkManager.DrivenExecutor syncExecutor, final Executor parallelExecutor, final Runnable periodicTask) { var stateList = stateManager.getStates(ModLoadingPhase.COMPLETE); var progress = StartupMessageManager.addProgressBar("Mod Complete", stateList.stream().mapToInt(mls -> mls.size().applyAsInt(modList)).sum()); - stateList.forEach(mls->dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); - statusConsumer.ifPresent(c->c.accept(String.format("Mod loading complete - %d mods loaded", this.modList.size()))); + stateList.forEach(mls -> dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress)); + statusConsumer.ifPresent(c -> c.accept(String.format("Mod loading complete - %d mods loaded", this.modList.size()))); progress.complete(); } @@ -212,21 +217,22 @@ private void dispatchAndHandleError(IModLoadingState state, ModWorkManager.Drive LOGGER.error("Cowardly refusing to process mod state change request from {}", state); return; } - progressBar.label(progressBar.name()+ " working"); + progressBar.label(progressBar.name() + " working"); syncExecutor.drive(ticker); - state.inlineRunnable().ifPresent(a->this.handleInlineTransition(a, state, syncExecutor, ticker)); - state.buildTransition(syncExecutor, parallelExecutor, progressBar).ifPresent(t->waitForTransition(state, syncExecutor, ticker, t)); + state.inlineRunnable().ifPresent(a -> this.handleInlineTransition(a, state, syncExecutor, ticker)); + state.buildTransition(syncExecutor, parallelExecutor, progressBar).ifPresent(t -> waitForTransition(state, syncExecutor, ticker, t)); completedStates.add(state); } private void handleInlineTransition(final Consumer transition, final IModLoadingState state, final ModWorkManager.DrivenExecutor syncExecutor, final Runnable ticker) { - var pb = StartupMessageManager.addProgressBar("State transition " +state.name()+" running", 0); + var pb = StartupMessageManager.addProgressBar("State transition " + state.name() + " running", 0); syncExecutor.drive(ticker); transition.accept(this.modList); syncExecutor.drive(ticker); pb.complete(); syncExecutor.drive(ticker); } + private void waitForTransition(final IModLoadingState state, final ModWorkManager.DrivenExecutor syncExecutor, final Runnable ticker, final CompletableFuture transition) { while (!transition.isDone()) { syncExecutor.drive(ticker); @@ -241,7 +247,7 @@ private void waitForTransition(final IModLoadingState state, final ModWorkManage .collect(Collectors.toList()); if (!notModLoading.isEmpty()) { LOGGER.fatal("Encountered non-modloading exceptions!", e); - statusConsumer.ifPresent(c->c.accept("ERROR DURING MOD LOADING")); + statusConsumer.ifPresent(c -> c.accept("ERROR DURING MOD LOADING")); throw e; } @@ -249,14 +255,13 @@ private void waitForTransition(final IModLoadingState state, final ModWorkManage .filter(ModLoadingException.class::isInstance) .map(ModLoadingException.class::cast) .collect(Collectors.toList()); - LOGGER.fatal(LOADING,"Failed to complete lifecycle event {}, {} errors found", state.name(), modLoadingExceptions.size()); - statusConsumer.ifPresent(c->c.accept("ERROR DURING MOD LOADING")); + LOGGER.fatal(LOADING, "Failed to complete lifecycle event {}, {} errors found", state.name(), modLoadingExceptions.size()); + statusConsumer.ifPresent(c -> c.accept("ERROR DURING MOD LOADING")); throw new LoadingFailedException(modLoadingExceptions); } } - private List buildMods(final IModFile modFile) - { + private List buildMods(final IModFile modFile) { final Map modInfoMap = modFile.getModFileInfo().getMods().stream().collect(Collectors.toMap(IModInfo::getModId, Function.identity())); LOGGER.trace(LOADING, "ModContainer is {}", ModContainer.class.getClassLoader()); @@ -270,7 +275,7 @@ private List buildMods(final IModFile modFile) var modIds = modInfoMap.values().stream().map(IModInfo::getModId).sorted().collect(Collectors.toList()); var containerIds = containers.stream().map(c -> c != null ? c.getModId() : "(null)").sorted().collect(Collectors.toList()); - LOGGER.fatal(LOADING,"File {} constructed {} mods: {}, but had {} mods specified: {}", + LOGGER.fatal(LOADING, "File {} constructed {} mods: {}, but had {} mods specified: {}", modFile.getFilePath(), containers.size(), containerIds, modInfoMap.size(), modIds); @@ -294,8 +299,8 @@ private ModContainer buildModContainerFromTOML(final IModFile modFile, final Map final String modId = idToProviderEntry.getKey(); final IModLanguageProvider.IModLanguageLoader languageLoader = idToProviderEntry.getValue(); IModInfo info = Optional.ofNullable(modInfoMap.get(modId)). - // throw a missing metadata error if there is no matching modid in the modInfoMap from the mods.toml file - orElseThrow(()->new ModLoadingException(null, ModLoadingStage.CONSTRUCT, "fml.modloading.missingmetadata", null, modId)); + // throw a missing metadata error if there is no matching modid in the modInfoMap from the mods.toml file + orElseThrow(() -> new ModLoadingException(null, ModLoadingStage.CONSTRUCT, "fml.modloading.missingmetadata", null, modId)); return languageLoader.loadMod(info, modFile.getScanResult(), FMLLoader.getGameLayer()); } catch (ModLoadingException mle) { // exceptions are caught and added to the error list for later handling @@ -307,7 +312,7 @@ private ModContainer buildModContainerFromTOML(final IModFile modFile, final Map /** * @return If the current mod loading state is valid. Use if you interact with vanilla systems directly during loading - * and don't want to cause extraneous crashes due to trying to do things that aren't possible in a "broken load" + * and don't want to cause extraneous crashes due to trying to do things that aren't possible in a "broken load" */ public static boolean isLoadingStateValid() { return get().loadingStateValid; @@ -346,13 +351,16 @@ public void postEvent(T e) { ModList.get().forEachModInOrder(mc -> mc.acceptEvent(phase, e)); } } + public T postEventWithReturn(T e) { postEvent(e); return e; } + public void postEventWrapContainerInModOrder(T event) { postEventWithWrapInModOrder(event, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e) -> ModLoadingContext.get().setActiveContainer(null)); } + public void postEventWithWrapInModOrder(T e, BiConsumer pre, BiConsumer post) { if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); @@ -367,19 +375,17 @@ public void postEventWithWrapInModOrder(T e, Bi } } - public List getWarnings() - { + public List getWarnings() { return ImmutableList.copyOf(this.loadingWarnings); } - public void addWarning(ModLoadingWarning warning) - { + public void addWarning(ModLoadingWarning warning) { this.loadingWarnings.add(warning); } private static boolean runningDataGen = false; - public static boolean isDataGenRunning () { + public static boolean isDataGenRunning() { return runningDataGen; } diff --git a/loader/src/main/java/net/neoforged/fml/ModLoadingContext.java b/loader/src/main/java/net/neoforged/fml/ModLoadingContext.java index 823c7da77..2af1885c6 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoadingContext.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoadingContext.java @@ -6,14 +6,12 @@ package net.neoforged.fml; import com.mojang.logging.LogUtils; +import java.util.function.Supplier; import net.neoforged.fml.config.IConfigSpec; import net.neoforged.fml.config.ModConfig; import org.slf4j.Logger; -import java.util.function.Supplier; - -public class ModLoadingContext -{ +public class ModLoadingContext { private static final Logger LOGGER = LogUtils.getLogger(); private static final ThreadLocal context = ThreadLocal.withInitial(ModLoadingContext::new); private Object languageExtension; @@ -31,7 +29,7 @@ public void setActiveContainer(final ModContainer container) { } public ModContainer getActiveContainer() { - return activeContainer == null ? ModList.get().getModContainerById("minecraft").orElseThrow(()->new RuntimeException("Where is minecraft???!")) : activeContainer; + return activeContainer == null ? ModList.get().getModContainerById("minecraft").orElseThrow(() -> new RuntimeException("Where is minecraft???!")) : activeContainer; } public String getActiveNamespace() { @@ -40,9 +38,10 @@ public String getActiveNamespace() { /** * Register an {@link IExtensionPoint} with the mod container. - * @param point The extension point to register + * + * @param point The extension point to register * @param extension An extension operator - * @param The type signature of the extension operator + * @param The type signature of the extension operator */ public void registerExtensionPoint(Class point, Supplier extension) { getActiveContainer().registerExtensionPoint(point, extension); @@ -64,9 +63,8 @@ public void registerConfig(ModConfig.Type type, IConfigSpec spec, String file getActiveContainer().registerConfig(type, spec, fileName); } - @SuppressWarnings("unchecked") public T extension() { - return (T)languageExtension; + return (T) languageExtension; } } diff --git a/loader/src/main/java/net/neoforged/fml/ModLoadingException.java b/loader/src/main/java/net/neoforged/fml/ModLoadingException.java index cbc3809e5..c6c9312df 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoadingException.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoadingException.java @@ -6,18 +6,16 @@ package net.neoforged.fml; import com.google.common.collect.Streams; -import net.neoforged.fml.loading.EarlyLoadingException; -import net.neoforged.neoforgespi.language.IModInfo; - import java.util.Arrays; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.EarlyLoadingException; +import net.neoforged.neoforgespi.language.IModInfo; /** * General purpose mod loading error message */ -public class ModLoadingException extends RuntimeException -{ +public class ModLoadingException extends RuntimeException { private static final long serialVersionUID = 2048947398536935507L; /** * Mod Info for mod with issue @@ -47,7 +45,7 @@ public ModLoadingException(final IModInfo modInfo, final ModLoadingStage errorSt } static Stream fromEarlyException(final EarlyLoadingException e) { - return e.getAllData().stream().map(ed->new ModLoadingException(ed.getModInfo(), ModLoadingStage.VALIDATE, ed.getI18message(), e.getCause(), ed.getArgs())); + return e.getAllData().stream().map(ed -> new ModLoadingException(ed.getModInfo(), ModLoadingStage.VALIDATE, ed.getI18message(), e.getCause(), ed.getArgs())); } public String getI18NMessage() { @@ -70,6 +68,7 @@ public String getMessage() { public IModInfo getModInfo() { return modInfo; } + public String getCleanMessage() { return Bindings.getMessageParser().get().stripControlCodes(formatToString()); } diff --git a/loader/src/main/java/net/neoforged/fml/ModLoadingStage.java b/loader/src/main/java/net/neoforged/fml/ModLoadingStage.java index 7202067ce..4ebd02599 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoadingStage.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoadingStage.java @@ -12,8 +12,7 @@ *

Each mod loading stage has a global {@link DeferredWorkQueue}, which is populated during the execution of the state * associated with this stage and emptied at the end of the state's execution.

*/ -public enum ModLoadingStage -{ +public enum ModLoadingStage { /** * Special stage for exceptional situations and error handling. */ @@ -66,7 +65,7 @@ public enum ModLoadingStage * @param exception the exception that occurred during this stage, may be {@code null} */ ModLoadingStage nextState(Throwable exception) { - return exception != null ? ERROR : values()[this.ordinal()+1]; + return exception != null ? ERROR : values()[this.ordinal() + 1]; } /** diff --git a/loader/src/main/java/net/neoforged/fml/ModLoadingState.java b/loader/src/main/java/net/neoforged/fml/ModLoadingState.java index 2b390a3ab..a477e2b1f 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoadingState.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoadingState.java @@ -5,16 +5,15 @@ package net.neoforged.fml; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; -import net.neoforged.fml.loading.progress.ProgressMeter; - import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.ToIntFunction; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.fml.loading.progress.ProgressMeter; /** * Implementation of the {@link IModLoadingState} interface. @@ -27,18 +26,17 @@ * @param transition optional state transition information */ public record ModLoadingState(String name, String previous, - Function message, - ToIntFunction size, - ModLoadingPhase phase, - Optional> inlineRunnable, - Optional transition) implements IModLoadingState { + Function message, + ToIntFunction size, + ModLoadingPhase phase, + Optional> inlineRunnable, + Optional transition) implements IModLoadingState { @Override - public - Optional> buildTransition(final Executor syncExecutor, - final Executor parallelExecutor, - final ProgressMeter progressBar, - final Function> preSyncTask, - final Function> postSyncTask) { + public Optional> buildTransition(final Executor syncExecutor, + final Executor parallelExecutor, + final ProgressMeter progressBar, + final Function> preSyncTask, + final Function> postSyncTask) { return transition.map(t -> t.build(name, syncExecutor, parallelExecutor, progressBar, preSyncTask, postSyncTask)); } @@ -51,7 +49,7 @@ Optional> buildTransition(final Executor syncExecutor, * @param phase the mod loading phase the state belongs to */ public static ModLoadingState empty(final String name, final String previous, final ModLoadingPhase phase) { - return new ModLoadingState(name, previous, ml -> "", f->0, phase, Optional.empty(), Optional.empty()); + return new ModLoadingState(name, previous, ml -> "", f -> 0, phase, Optional.empty(), Optional.empty()); } /** @@ -65,7 +63,7 @@ public static ModLoadingState empty(final String name, final String previous, fi * @return a mod loading state with state transition information and a default message */ public static ModLoadingState withTransition(final String name, final String previous, final ModLoadingPhase phase, - final IModStateTransition transition) { + final IModStateTransition transition) { return new ModLoadingState(name, previous, ml -> "Processing transition " + name, ModList::size, phase, Optional.empty(), Optional.of(transition)); } @@ -80,8 +78,8 @@ public static ModLoadingState withTransition(final String name, final String pre * @return a mod loading state with state transition information and a custom message */ public static ModLoadingState withTransition(final String name, final String previous, - final Function message, final ModLoadingPhase phase, - final IModStateTransition transition) { + final Function message, final ModLoadingPhase phase, + final IModStateTransition transition) { return new ModLoadingState(name, previous, message, ModList::size, phase, Optional.empty(), Optional.of(transition)); } @@ -96,7 +94,7 @@ public static ModLoadingState withTransition(final String name, final String pre * @return a mod loading state with an inline runnable and default message */ public static ModLoadingState withInline(final String name, final String previous, final ModLoadingPhase phase, - final Consumer inline) { - return new ModLoadingState(name, previous, ml -> "Processing work " + name, ml->0, phase, Optional.of(inline), Optional.empty()); + final Consumer inline) { + return new ModLoadingState(name, previous, ml -> "Processing work " + name, ml -> 0, phase, Optional.of(inline), Optional.empty()); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/ModLoadingWarning.java b/loader/src/main/java/net/neoforged/fml/ModLoadingWarning.java index 2d2d7d22b..5b2d7da89 100644 --- a/loader/src/main/java/net/neoforged/fml/ModLoadingWarning.java +++ b/loader/src/main/java/net/neoforged/fml/ModLoadingWarning.java @@ -6,15 +6,13 @@ package net.neoforged.fml; import com.google.common.collect.Streams; -import net.neoforged.fml.loading.EarlyLoadingException; -import net.neoforged.neoforgespi.language.IModInfo; - import java.util.Arrays; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.EarlyLoadingException; +import net.neoforged.neoforgespi.language.IModInfo; -public class ModLoadingWarning -{ +public class ModLoadingWarning { /** * Mod Info for mod with warning */ @@ -46,6 +44,6 @@ public String formatToString() { } static Stream fromEarlyException(final EarlyLoadingException e) { - return e.getAllData().stream().map(ed->new ModLoadingWarning(ed.getModInfo(), ModLoadingStage.VALIDATE, ed.getI18message(), ed.getArgs())); + return e.getAllData().stream().map(ed -> new ModLoadingWarning(ed.getModInfo(), ModLoadingStage.VALIDATE, ed.getI18message(), ed.getArgs())); } } diff --git a/loader/src/main/java/net/neoforged/fml/ModStateManager.java b/loader/src/main/java/net/neoforged/fml/ModStateManager.java index 16ea189bc..de08e23f7 100644 --- a/loader/src/main/java/net/neoforged/fml/ModStateManager.java +++ b/loader/src/main/java/net/neoforged/fml/ModStateManager.java @@ -7,12 +7,15 @@ import com.google.common.graph.GraphBuilder; import cpw.mods.modlauncher.util.ServiceLoaderUtils; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.toposort.TopologicalSort; - -import java.util.*; +import java.util.Collection; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.List; +import java.util.ServiceLoader; import java.util.function.Function; import java.util.stream.Collectors; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.toposort.TopologicalSort; @SuppressWarnings("UnstableApiUsage") public class ModStateManager { @@ -22,10 +25,10 @@ public class ModStateManager { public ModStateManager() { INSTANCE = this; final var sp = ServiceLoader.load(FMLLoader.getGameLayer(), IModStateProvider.class); - this.stateMap = ServiceLoaderUtils.streamWithErrorHandling(sp, sce->{}) + this.stateMap = ServiceLoaderUtils.streamWithErrorHandling(sp, sce -> {}) .map(IModStateProvider::getAllStates) .mapMulti(Iterable::forEach) - .collect(Collectors.groupingBy(IModLoadingState::phase, ()->new EnumMap<>(ModLoadingPhase.class), Collectors.toUnmodifiableList())); + .collect(Collectors.groupingBy(IModLoadingState::phase, () -> new EnumMap<>(ModLoadingPhase.class), Collectors.toUnmodifiableList())); } public List getStates(final ModLoadingPhase phase) { @@ -36,8 +39,8 @@ public List getStates(final ModLoadingPhase phase) { var dummy = ModLoadingState.empty("", "", phase); nodes.forEach(graph::addNode); graph.addNode(dummy); - nodes.forEach(n->graph.putEdge(lookup.getOrDefault(n.previous(), dummy), n)); - return TopologicalSort.topologicalSort(graph, Comparator.comparingInt(nodes::indexOf)).stream().filter(st->st!=dummy).toList(); + nodes.forEach(n -> graph.putEdge(lookup.getOrDefault(n.previous(), dummy), n)); + return TopologicalSort.topologicalSort(graph, Comparator.comparingInt(nodes::indexOf)).stream().filter(st -> st != dummy).toList(); } public IModLoadingState findState(final String stateName) { diff --git a/loader/src/main/java/net/neoforged/fml/ModWorkManager.java b/loader/src/main/java/net/neoforged/fml/ModWorkManager.java index 044b6015d..93dfd6812 100644 --- a/loader/src/main/java/net/neoforged/fml/ModWorkManager.java +++ b/loader/src/main/java/net/neoforged/fml/ModWorkManager.java @@ -5,20 +5,25 @@ package net.neoforged.fml; +import static net.neoforged.fml.Logging.LOADING; + +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.Executor; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinWorkerThread; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.LockSupport; import net.neoforged.fml.loading.FMLConfig; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.concurrent.*; -import java.util.concurrent.locks.LockSupport; - -import static net.neoforged.fml.Logging.LOADING; - public class ModWorkManager { private static final Logger LOGGER = LogManager.getLogger(); private static final long PARK_TIME = TimeUnit.MILLISECONDS.toNanos(1); + public interface DrivenExecutor extends Executor { boolean selfDriven(); + boolean driveOne(); default void drive(Runnable ticker) { @@ -30,12 +35,13 @@ default void drive(Runnable ticker) { ranOne = true; } } - if(!ranOne) { + if (!ranOne) { // park for a bit so other threads can schedule LockSupport.parkNanos(PARK_TIME); } } } + private static class SyncExecutor implements DrivenExecutor { private ConcurrentLinkedDeque tasks = new ConcurrentLinkedDeque<>(); @@ -95,6 +101,7 @@ public static DrivenExecutor wrappedExecutor(Executor executor) { } private static ForkJoinPool parallelThreadPool; + public static Executor parallelExecutor() { if (parallelThreadPool == null) { final int loadingThreadCount = FMLConfig.getIntConfigValue(FMLConfig.ConfigValue.MAX_THREADS); @@ -111,5 +118,4 @@ private static ForkJoinWorkerThread newForkJoinWorkerThread(ForkJoinPool pool) { thread.setContextClassLoader(Thread.currentThread().getContextClassLoader()); return thread; } - } diff --git a/loader/src/main/java/net/neoforged/fml/StartupMessageManager.java b/loader/src/main/java/net/neoforged/fml/StartupMessageManager.java index 55c071226..f092a9d00 100644 --- a/loader/src/main/java/net/neoforged/fml/StartupMessageManager.java +++ b/loader/src/main/java/net/neoforged/fml/StartupMessageManager.java @@ -5,11 +5,10 @@ package net.neoforged.fml; -import net.neoforged.fml.loading.progress.ProgressMeter; -import net.neoforged.fml.loading.progress.StartupNotificationManager; - import java.util.Optional; import java.util.function.Consumer; +import net.neoforged.fml.loading.progress.ProgressMeter; +import net.neoforged.fml.loading.progress.StartupNotificationManager; public class StartupMessageManager { public static void addModMessage(final String message) { diff --git a/loader/src/main/java/net/neoforged/fml/VersionChecker.java b/loader/src/main/java/net/neoforged/fml/VersionChecker.java index 3756ee5c4..449531285 100644 --- a/loader/src/main/java/net/neoforged/fml/VersionChecker.java +++ b/loader/src/main/java/net/neoforged/fml/VersionChecker.java @@ -5,14 +5,15 @@ package net.neoforged.fml; -import com.google.gson.Gson; -import net.neoforged.fml.loading.FMLConfig; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.neoforgespi.language.IModInfo; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.maven.artifact.versioning.ComparableVersion; +import static net.neoforged.fml.VersionChecker.Status.AHEAD; +import static net.neoforged.fml.VersionChecker.Status.BETA; +import static net.neoforged.fml.VersionChecker.Status.BETA_OUTDATED; +import static net.neoforged.fml.VersionChecker.Status.FAILED; +import static net.neoforged.fml.VersionChecker.Status.OUTDATED; +import static net.neoforged.fml.VersionChecker.Status.PENDING; +import static net.neoforged.fml.VersionChecker.Status.UP_TO_DATE; +import com.google.gson.Gson; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -32,17 +33,19 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; +import net.neoforged.fml.loading.FMLConfig; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforgespi.language.IModInfo; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.maven.artifact.versioning.ComparableVersion; -import static net.neoforged.fml.VersionChecker.Status.*; - -public class VersionChecker -{ +public class VersionChecker { private static final Logger LOGGER = LogManager.getLogger(); private static final int MAX_HTTP_REDIRECTS = Integer.getInteger("http.maxRedirects", 20); private static final int HTTP_TIMEOUT_SECS = Integer.getInteger("http.timeoutSecs", 15); - public enum Status - { + public enum Status { PENDING(), FAILED(), UP_TO_DATE(), @@ -54,58 +57,46 @@ public enum Status final int sheetOffset; final boolean draw, animated; - Status() - { + Status() { this(0, false, false); } - Status(int sheetOffset) - { + Status(int sheetOffset) { this(sheetOffset, true, false); } - Status(int sheetOffset, boolean animated) - { + Status(int sheetOffset, boolean animated) { this(sheetOffset, true, animated); } - Status(int sheetOffset, boolean draw, boolean animated) - { + Status(int sheetOffset, boolean draw, boolean animated) { this.sheetOffset = sheetOffset; this.draw = draw; this.animated = animated; } - public int getSheetOffset() - { + public int getSheetOffset() { return sheetOffset; } - public boolean shouldDraw() - { + public boolean shouldDraw() { return draw; } - public boolean isAnimated() - { + public boolean isAnimated() { return animated; } - } public record CheckResult(VersionChecker.Status status, ComparableVersion target, Map changes, String url) {} - public static void startVersionCheck() - { - new Thread("Forge Version Check") - { + public static void startVersionCheck() { + new Thread("Forge Version Check") { private HttpClient client; @Override - public void run() - { - if (!FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.VERSION_CHECK)) - { + public void run() { + if (!FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.VERSION_CHECK)) { LOGGER.info("Global NeoForge version check system disabled, no further processing."); return; } @@ -126,8 +117,7 @@ private String openUrlString(URL url, IModInfo mod) throws IOException, URISynta sb.append(mod.getModId()).append('/').append(mod.getVersion()); final String userAgent = sb.toString(); - for (int redirects = 0; redirects < MAX_HTTP_REDIRECTS; redirects++) - { + for (int redirects = 0; redirects < MAX_HTTP_REDIRECTS; redirects++) { var request = HttpRequest.newBuilder() .uri(currentUrl.toURI()) .timeout(Duration.ofSeconds(HTTP_TIMEOUT_SECS)) @@ -139,8 +129,7 @@ private String openUrlString(URL url, IModInfo mod) throws IOException, URISynta final HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofInputStream()); int responseCode = response.statusCode(); - if (responseCode >= 300 && responseCode <= 399) - { + if (responseCode >= 300 && responseCode <= 399) { String newLocation = response.headers().firstValue("Location") .orElseThrow(() -> new IOException("Got a 3xx response code but Location header was null while trying to fetch " + url)); currentUrl = new URL(currentUrl, newLocation); @@ -150,10 +139,8 @@ private String openUrlString(URL url, IModInfo mod) throws IOException, URISynta final boolean isGzipEncoded = response.headers().firstValue("Content-Encoding").orElse("").equals("gzip"); final String bodyStr; - try (InputStream inStream = isGzipEncoded ? new GZIPInputStream(response.body()) : response.body()) - { - try (var bufferedReader = new BufferedReader(new InputStreamReader(inStream))) - { + try (InputStream inStream = isGzipEncoded ? new GZIPInputStream(response.body()) : response.body()) { + try (var bufferedReader = new BufferedReader(new InputStreamReader(inStream))) { bodyStr = bufferedReader.lines().collect(Collectors.joining("\n")); } } @@ -162,14 +149,12 @@ private String openUrlString(URL url, IModInfo mod) throws IOException, URISynta throw new IOException("Too many redirects while trying to fetch " + url); } - private void process(IModInfo mod) - { + private void process(IModInfo mod) { Status status = PENDING; ComparableVersion target = null; Map changes = null; String display_url = null; - try - { + try { if (mod.getUpdateURL().isEmpty()) return; URL url = mod.getUpdateURL().get(); LOGGER.info("[{}] Starting version check at {}", mod.getModId(), url.toString()); @@ -178,82 +163,66 @@ private void process(IModInfo mod) LOGGER.debug("[{}] Received version check data:\n{}", mod.getModId(), data); - @SuppressWarnings("unchecked") Map json = new Gson().fromJson(data, Map.class); @SuppressWarnings("unchecked") - Map promos = (Map)json.get("promos"); - display_url = (String)json.get("homepage"); + Map promos = (Map) json.get("promos"); + display_url = (String) json.get("homepage"); var mcVersion = FMLLoader.versionInfo().mcVersion(); String rec = promos.get(mcVersion + "-recommended"); String lat = promos.get(mcVersion + "-latest"); ComparableVersion current = new ComparableVersion(mod.getVersion().toString()); - if (rec != null) - { + if (rec != null) { ComparableVersion recommended = new ComparableVersion(rec); int diff = recommended.compareTo(current); if (diff == 0) status = UP_TO_DATE; - else if (diff < 0) - { + else if (diff < 0) { status = AHEAD; - if (lat != null) - { + if (lat != null) { ComparableVersion latest = new ComparableVersion(lat); - if (current.compareTo(latest) < 0) - { + if (current.compareTo(latest) < 0) { status = OUTDATED; target = latest; } } - } - else - { + } else { status = OUTDATED; target = recommended; } - } - else if (lat != null) - { + } else if (lat != null) { ComparableVersion latest = new ComparableVersion(lat); if (current.compareTo(latest) < 0) status = BETA_OUTDATED; else status = BETA; target = latest; - } - else + } else status = BETA; LOGGER.info("[{}] Found status: {} Current: {} Target: {}", mod.getModId(), status, current, target); changes = new LinkedHashMap<>(); @SuppressWarnings("unchecked") - Map tmp = (Map)json.get(mcVersion); - if (tmp != null) - { + Map tmp = (Map) json.get(mcVersion); + if (tmp != null) { List ordered = new ArrayList<>(); - for (String key : tmp.keySet()) - { + for (String key : tmp.keySet()) { ComparableVersion ver = new ComparableVersion(key); - if (ver.compareTo(current) > 0 && (target == null || ver.compareTo(target) < 1)) - { + if (ver.compareTo(current) > 0 && (target == null || ver.compareTo(target) < 1)) { ordered.add(ver); } } Collections.sort(ordered); - for (ComparableVersion ver : ordered) - { + for (ComparableVersion ver : ordered) { changes.put(ver, tmp.get(ver.toString())); } } - } - catch (Exception e) - { + } catch (Exception e) { LOGGER.warn("Failed to process update information", e); status = FAILED; } @@ -263,8 +232,7 @@ else if (lat != null) } // Gather a list of mods that have opted in to this update system by providing a URL. - private static List gatherMods() - { + private static List gatherMods() { List ret = new LinkedList<>(); for (IModInfo info : ModList.get().getMods()) { if (info.getUpdateURL().isPresent()) @@ -276,9 +244,7 @@ private static List gatherMods() private static Map results = new ConcurrentHashMap<>(); private static final CheckResult PENDING_CHECK = new CheckResult(PENDING, null, null, null); - public static CheckResult getResult(IModInfo mod) - { + public static CheckResult getResult(IModInfo mod) { return results.getOrDefault(mod, PENDING_CHECK); } - } diff --git a/loader/src/main/java/net/neoforged/fml/common/Mod.java b/loader/src/main/java/net/neoforged/fml/common/Mod.java index c91dde7f5..4e1988331 100644 --- a/loader/src/main/java/net/neoforged/fml/common/Mod.java +++ b/loader/src/main/java/net/neoforged/fml/common/Mod.java @@ -10,7 +10,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.function.Supplier; - import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.Bindings; @@ -25,8 +24,7 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface Mod -{ +public @interface Mod { /** * The unique mod identifier for this mod. * Required to be lowercased in the english locale for compatibility. Will be truncated to 64 characters long. @@ -57,6 +55,7 @@ /** * Optional value, only necessary if this annotation is not on the same class that has a @Mod annotation. * Needed to prevent early classloading of classes not owned by your mod. + * * @return a modid */ String modid() default ""; @@ -77,9 +76,10 @@ enum Bus { FORGE(Bindings.getForgeBus()), /** * The mod specific Event bus. + * * @see ModContainer#getEventBus() */ - MOD(()-> FMLJavaModLoadingContext.get().getModEventBus()); + MOD(() -> FMLJavaModLoadingContext.get().getModEventBus()); private final Supplier busSupplier; diff --git a/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeDistCleaner.java b/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeDistCleaner.java index 7fef92a35..ed08e15f6 100644 --- a/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeDistCleaner.java +++ b/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeDistCleaner.java @@ -5,6 +5,9 @@ package net.neoforged.fml.common.asm; +import com.google.common.collect.Streams; +import com.mojang.logging.LogUtils; +import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; @@ -14,10 +17,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.stream.Collectors; - -import com.google.common.collect.Streams; -import com.mojang.logging.LogUtils; -import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIns; @@ -34,42 +33,38 @@ import org.slf4j.Marker; import org.slf4j.MarkerFactory; -public class RuntimeDistCleaner implements ILaunchPluginService -{ +public class RuntimeDistCleaner implements ILaunchPluginService { private static final Logger LOGGER = LogUtils.getLogger(); private static final Marker DISTXFORM = MarkerFactory.getMarker("DISTXFORM"); private static String DIST; private static final String ONLYIN = Type.getDescriptor(OnlyIn.class); private static final String ONLYINS = Type.getDescriptor(OnlyIns.class); + @Override - public String name() - { + public String name() { return "runtimedistcleaner"; } @Override - public int processClassWithFlags(final Phase phase, final ClassNode classNode, final Type classType, final String reason) - { + public int processClassWithFlags(final Phase phase, final ClassNode classNode, final Type classType, final String reason) { AtomicBoolean changes = new AtomicBoolean(); - if (remove(classNode.visibleAnnotations, DIST)) - { + if (remove(classNode.visibleAnnotations, DIST)) { LOGGER.error(DISTXFORM, "Attempted to load class {} for invalid dist {}", classNode.name, DIST); - throw new RuntimeException("Attempted to load class "+ classNode.name + " for invalid dist "+ DIST); + throw new RuntimeException("Attempted to load class " + classNode.name + " for invalid dist " + DIST); } - if (classNode.interfaces != null ) - { + if (classNode.interfaces != null) { unpack(classNode.visibleAnnotations).stream() - .filter(ann->Objects.equals(ann.desc, ONLYIN)) - .filter(ann->ann.values.indexOf("_interface") != -1) - .filter(ann->!Objects.equals(((String[])ann.values.get(ann.values.indexOf("value") + 1))[1], DIST)) - .map(ann -> ((Type)ann.values.get(ann.values.indexOf("_interface") + 1)).getInternalName()) - .forEach(intf -> { - if (classNode.interfaces.remove(intf)) { - LOGGER.debug(DISTXFORM,"Removing Interface: {} implements {}", classNode.name, intf); - changes.compareAndSet(false, true); - } - }); + .filter(ann -> Objects.equals(ann.desc, ONLYIN)) + .filter(ann -> ann.values.indexOf("_interface") != -1) + .filter(ann -> !Objects.equals(((String[]) ann.values.get(ann.values.indexOf("value") + 1))[1], DIST)) + .map(ann -> ((Type) ann.values.get(ann.values.indexOf("_interface") + 1)).getInternalName()) + .forEach(intf -> { + if (classNode.interfaces.remove(intf)) { + LOGGER.debug(DISTXFORM, "Removing Interface: {} implements {}", classNode.name, intf); + changes.compareAndSet(false, true); + } + }); //Remove Class level @OnlyIn/@OnlyIns annotations, this is important if anyone gets ambitious and tries to reflect an annotation with _interface set. if (classNode.visibleAnnotations != null) { @@ -77,7 +72,7 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f while (itr.hasNext()) { AnnotationNode ann = itr.next(); if (Objects.equals(ann.desc, ONLYIN) || Objects.equals(ann.desc, ONLYINS)) { - LOGGER.debug(DISTXFORM,"Removing Class Annotation: {} @{}", classNode.name, ann.desc); + LOGGER.debug(DISTXFORM, "Removing Class Annotation: {} @{}", classNode.name, ann.desc); itr.remove(); changes.compareAndSet(false, true); } @@ -86,12 +81,10 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f } Iterator fields = classNode.fields.iterator(); - while(fields.hasNext()) - { + while (fields.hasNext()) { FieldNode field = fields.next(); - if (remove(field.visibleAnnotations, DIST)) - { - LOGGER.debug(DISTXFORM,"Removing field: {}.{}", classNode.name, field.name); + if (remove(field.visibleAnnotations, DIST)) { + LOGGER.debug(DISTXFORM, "Removing field: {}.{}", classNode.name, field.name); fields.remove(); changes.compareAndSet(false, true); } @@ -99,12 +92,10 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f LambdaGatherer lambdaGatherer = new LambdaGatherer(); Iterator methods = classNode.methods.iterator(); - while(methods.hasNext()) - { + while (methods.hasNext()) { MethodNode method = methods.next(); - if (remove(method.visibleAnnotations, DIST)) - { - LOGGER.debug(DISTXFORM,"Removing method: {}.{}{}", classNode.name, method.name, method.desc); + if (remove(method.visibleAnnotations, DIST)) { + LOGGER.debug(DISTXFORM, "Removing method: {}.{}{}", classNode.name, method.name, method.desc); methods.remove(); lambdaGatherer.accept(method); changes.compareAndSet(false, true); @@ -112,20 +103,15 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f } // remove dynamic synthetic lambda methods that are inside of removed methods - for (List dynamicLambdaHandles = lambdaGatherer.getDynamicLambdaHandles(); - !dynamicLambdaHandles.isEmpty(); dynamicLambdaHandles = lambdaGatherer.getDynamicLambdaHandles()) - { + for (List dynamicLambdaHandles = lambdaGatherer.getDynamicLambdaHandles(); !dynamicLambdaHandles.isEmpty(); dynamicLambdaHandles = lambdaGatherer.getDynamicLambdaHandles()) { lambdaGatherer = new LambdaGatherer(); methods = classNode.methods.iterator(); - while (methods.hasNext()) - { + while (methods.hasNext()) { MethodNode method = methods.next(); if ((method.access & Opcodes.ACC_SYNTHETIC) == 0) continue; - for (Handle dynamicLambdaHandle : dynamicLambdaHandles) - { - if (method.name.equals(dynamicLambdaHandle.getName()) && method.desc.equals(dynamicLambdaHandle.getDesc())) - { - LOGGER.debug(DISTXFORM,"Removing lambda method: {}.{}{}", classNode.name, method.name, method.desc); + for (Handle dynamicLambdaHandle : dynamicLambdaHandles) { + if (method.name.equals(dynamicLambdaHandle.getName()) && method.desc.equals(dynamicLambdaHandle.getDesc())) { + LOGGER.debug(DISTXFORM, "Removing lambda method: {}.{}{}", classNode.name, method.name, method.desc); methods.remove(); lambdaGatherer.accept(method); changes.compareAndSet(false, true); @@ -139,27 +125,22 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f @SuppressWarnings("unchecked") private static List unpack(final List anns) { if (anns == null) return Collections.emptyList(); - List ret = anns.stream().filter(ann->Objects.equals(ann.desc, ONLYIN)).collect(Collectors.toList()); - anns.stream().filter(ann->Objects.equals(ann.desc, ONLYINS) && ann.values != null) - .map( ann -> (List)ann.values.get(ann.values.indexOf("value") + 1)) - .filter(v -> v != null) - .forEach(v -> v.forEach(ret::add)); + List ret = anns.stream().filter(ann -> Objects.equals(ann.desc, ONLYIN)).collect(Collectors.toList()); + anns.stream().filter(ann -> Objects.equals(ann.desc, ONLYINS) && ann.values != null) + .map(ann -> (List) ann.values.get(ann.values.indexOf("value") + 1)) + .filter(v -> v != null) + .forEach(v -> v.forEach(ret::add)); return ret; } - private boolean remove(final List anns, final String side) - { - return unpack(anns).stream(). - filter(ann->Objects.equals(ann.desc, ONLYIN)). - filter(ann->ann.values.indexOf("_interface") == -1). - anyMatch(ann -> !Objects.equals(((String[])ann.values.get(ann.values.indexOf("value")+1))[1], side)); + private boolean remove(final List anns, final String side) { + return unpack(anns).stream().filter(ann -> Objects.equals(ann.desc, ONLYIN)).filter(ann -> ann.values.indexOf("_interface") == -1).anyMatch(ann -> !Objects.equals(((String[]) ann.values.get(ann.values.indexOf("value") + 1))[1], side)); } @SuppressWarnings("unchecked") @Override - public Consumer getExtension() - { - return (s)-> { + public Consumer getExtension() { + return (s) -> { DIST = s.name(); LOGGER.debug(DISTXFORM, "Configuring for Dist {}", DIST); }; @@ -169,8 +150,7 @@ public Consumer getExtension() private static final EnumSet NAY = EnumSet.noneOf(Phase.class); @Override - public EnumSet handlesClass(Type classType, boolean isEmpty) - { + public EnumSet handlesClass(Type classType, boolean isEmpty) { return isEmpty ? NAY : YAY; } @@ -186,23 +166,18 @@ public LambdaGatherer() { } public void accept(MethodNode method) { - Streams.stream(method.instructions.iterator()). - filter(insnNode->insnNode.getType() == AbstractInsnNode.INVOKE_DYNAMIC_INSN). - forEach(insnNode->insnNode.accept(this)); + Streams.stream(method.instructions.iterator()).filter(insnNode -> insnNode.getType() == AbstractInsnNode.INVOKE_DYNAMIC_INSN).forEach(insnNode -> insnNode.accept(this)); } @Override - public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) - { - if (META_FACTORY.equals(bsm)) - { + public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { + if (META_FACTORY.equals(bsm)) { Handle dynamicLambdaHandle = (Handle) bsmArgs[1]; dynamicLambdaHandles.add(dynamicLambdaHandle); } } - public List getDynamicLambdaHandles() - { + public List getDynamicLambdaHandles() { return dynamicLambdaHandles; } } diff --git a/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeEnumExtender.java b/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeEnumExtender.java index 9f87de1c1..ad3fd09fb 100644 --- a/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeEnumExtender.java +++ b/loader/src/main/java/net/neoforged/fml/common/asm/RuntimeEnumExtender.java @@ -5,11 +5,11 @@ package net.neoforged.fml.common.asm; +import com.mojang.logging.LogUtils; +import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; - -import com.mojang.logging.LogUtils; import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -17,18 +17,13 @@ import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.MethodNode; - -import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import org.slf4j.Logger; -import org.slf4j.Marker; -import org.slf4j.MarkerFactory; /** * Modifies specified enums to allow runtime extension by making the $VALUES field non-final and * injecting constructor calls which are not valid in normal java code. */ public class RuntimeEnumExtender implements ILaunchPluginService { - private static final Logger LOGGER = LogUtils.getLogger(); private final Type STRING = Type.getType(String.class); private final Type ENUM = Type.getType(Enum.class); @@ -49,14 +44,12 @@ public String name() { private static final EnumSet NAY = EnumSet.noneOf(Phase.class); @Override - public EnumSet handlesClass(Type classType, boolean isEmpty) - { + public EnumSet handlesClass(Type classType, boolean isEmpty) { return isEmpty ? NAY : YAY; } @Override - public int processClassWithFlags(final Phase phase, final ClassNode classNode, final Type classType, final String reason) - { + public int processClassWithFlags(final Phase phase, final ClassNode classNode, final Type classType, final String reason) { if ((classNode.access & Opcodes.ACC_ENUM) == 0) return ComputeFlags.NO_REWRITE; @@ -78,12 +71,10 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f throw new IllegalStateException("IExtensibleEnum has no candidate factory methods: " + classType.getClassName()); } - candidates.forEach(mtd -> - { + candidates.forEach(mtd -> { Type[] args = Type.getArgumentTypes(mtd.desc); if (args.length == 0 || !args[0].equals(STRING)) { - if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) - { + if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) { StringBuilder sb = new StringBuilder(); sb.append("Enum has create method without String as first parameter:\n"); sb.append(" Enum: ").append(classType.getDescriptor()).append("\n"); @@ -95,8 +86,7 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f Type ret = Type.getReturnType(mtd.desc); if (!ret.equals(classType)) { - if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) - { + if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) { StringBuilder sb = new StringBuilder(); sb.append("Enum has create method with incorrect return type:\n"); sb.append(" Enum: ").append(classType.getDescriptor()).append("\n"); @@ -116,10 +106,8 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f String desc = Type.getMethodDescriptor(Type.VOID_TYPE, ctrArgs); MethodNode ctr = classNode.methods.stream().filter(m -> m.name.equals("") && m.desc.equals(desc)).findFirst().orElse(null); - if (ctr == null) - { - if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) - { + if (ctr == null) { + if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) { StringBuilder sb = new StringBuilder(); sb.append("Enum has create method with no matching constructor:\n"); sb.append(" Enum: ").append(classType.getDescriptor()).append("\n"); @@ -131,14 +119,11 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f throw new IllegalStateException("Enum has create method with no matching constructor: " + desc); } - if (values == null) - { - if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) - { + if (values == null) { + if (LOGGER.isErrorEnabled(LogUtils.FATAL_MARKER)) { StringBuilder sb = new StringBuilder(); sb.append("Enum has create method but we could not find $VALUES. Found:\n"); - classNode.fields.stream().filter(f -> (f.access & Opcodes.ACC_STATIC) != 0). - forEach(m -> sb.append(" ").append(m.name).append(" ").append(m.desc).append("\n")); + classNode.fields.stream().filter(f -> (f.access & Opcodes.ACC_STATIC) != 0).forEach(m -> sb.append(" ").append(m.name).append(" ").append(m.desc).append("\n")); LOGGER.error(LogUtils.FATAL_MARKER, sb.toString()); } throw new IllegalStateException("Enum has create method but we could not find $VALUES"); @@ -149,16 +134,13 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f mtd.access |= Opcodes.ACC_SYNCHRONIZED; mtd.instructions.clear(); mtd.localVariables.clear(); - if (mtd.tryCatchBlocks != null) - { + if (mtd.tryCatchBlocks != null) { mtd.tryCatchBlocks.clear(); } - if (mtd.visibleLocalVariableAnnotations != null) - { + if (mtd.visibleLocalVariableAnnotations != null) { mtd.visibleLocalVariableAnnotations.clear(); } - if (mtd.invisibleLocalVariableAnnotations != null) - { + if (mtd.invisibleLocalVariableAnnotations != null) { mtd.invisibleLocalVariableAnnotations.clear(); } InstructionAdapter ins = new InstructionAdapter(mtd); @@ -210,8 +192,7 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f ins.getstatic(classType.getInternalName(), values.name, values.desc); ins.arraylength(); int idx = 1; - for (int x = 1; x < args.length; x++) - { + for (int x = 1; x < args.length; x++) { ins.load(idx, args[x]); idx += args[x].getSize(); } @@ -236,5 +217,4 @@ public int processClassWithFlags(final Phase phase, final ClassNode classNode, f }); return ComputeFlags.COMPUTE_FRAMES; } - } diff --git a/loader/src/main/java/net/neoforged/fml/config/ConfigFileTypeHandler.java b/loader/src/main/java/net/neoforged/fml/config/ConfigFileTypeHandler.java index c188698af..0514a4d90 100644 --- a/loader/src/main/java/net/neoforged/fml/config/ConfigFileTypeHandler.java +++ b/loader/src/main/java/net/neoforged/fml/config/ConfigFileTypeHandler.java @@ -5,23 +5,22 @@ package net.neoforged.fml.config; +import static net.neoforged.fml.config.ConfigTracker.CONFIG; + import com.electronwill.nightconfig.core.ConfigFormat; import com.electronwill.nightconfig.core.file.CommentedFileConfig; import com.electronwill.nightconfig.core.file.FileWatcher; import com.electronwill.nightconfig.core.io.ParsingException; import com.electronwill.nightconfig.core.io.WritingMode; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.FMLConfig; -import net.neoforged.fml.loading.FMLPaths; -import org.apache.commons.io.FilenameUtils; -import org.slf4j.Logger; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Function; - -import static net.neoforged.fml.config.ConfigTracker.CONFIG; +import net.neoforged.fml.loading.FMLConfig; +import net.neoforged.fml.loading.FMLPaths; +import org.apache.commons.io.FilenameUtils; +import org.slf4j.Logger; public class ConfigFileTypeHandler { private static final Logger LOGGER = LogUtils.getLogger(); @@ -39,22 +38,16 @@ public Function reader(Path configBasePath) { .writingMode(WritingMode.REPLACE) .build(); LOGGER.debug(CONFIG, "Built TOML config for {}", configPath); - try - { + try { configData.load(); - } - catch (ParsingException ex) - { + } catch (ParsingException ex) { LOGGER.warn(CONFIG, "Attempting to recreate {}", configPath); - try - { + try { backUpConfig(configData.getNioPath(), 5); Files.delete(configData.getNioPath()); configData.load(); - } - catch (Throwable t) - { + } catch (Throwable t) { ex.addSuppressed(t); throw new ConfigLoadingException(c, ex); @@ -97,39 +90,31 @@ private boolean setupConfigFile(final ModConfig modConfig, final Path file, fina return true; } - public static void backUpConfig(final CommentedFileConfig commentedFileConfig) - { + public static void backUpConfig(final CommentedFileConfig commentedFileConfig) { backUpConfig(commentedFileConfig, 5); //TODO: Think of a way for mods to set their own preference (include a sanity check as well, no disk stuffing) } - public static void backUpConfig(final CommentedFileConfig commentedFileConfig, final int maxBackups) - { + public static void backUpConfig(final CommentedFileConfig commentedFileConfig, final int maxBackups) { backUpConfig(commentedFileConfig.getNioPath(), maxBackups); } - public static void backUpConfig(final Path commentedFileConfig, final int maxBackups) - { + public static void backUpConfig(final Path commentedFileConfig, final int maxBackups) { Path bakFileLocation = commentedFileConfig.getParent(); String bakFileName = FilenameUtils.removeExtension(commentedFileConfig.getFileName().toString()); String bakFileExtension = FilenameUtils.getExtension(commentedFileConfig.getFileName().toString()) + ".bak"; Path bakFile = bakFileLocation.resolve(bakFileName + "-1" + "." + bakFileExtension); - try - { - for(int i = maxBackups; i > 0; i--) - { + try { + for (int i = maxBackups; i > 0; i--) { Path oldBak = bakFileLocation.resolve(bakFileName + "-" + i + "." + bakFileExtension); - if(Files.exists(oldBak)) - { - if(i >= maxBackups) + if (Files.exists(oldBak)) { + if (i >= maxBackups) Files.delete(oldBak); else Files.move(oldBak, bakFileLocation.resolve(bakFileName + "-" + (i + 1) + "." + bakFileExtension)); } } Files.copy(commentedFileConfig, bakFile); - } - catch (IOException exception) - { + } catch (IOException exception) { LOGGER.warn(CONFIG, "Failed to back up config file {}", commentedFileConfig, exception); } } @@ -150,19 +135,15 @@ public void run() { // Force the regular classloader onto the special thread Thread.currentThread().setContextClassLoader(realClassLoader); if (!this.modConfig.getSpec().isCorrecting()) { - try - { + try { this.commentedFileConfig.load(); - if(!this.modConfig.getSpec().isCorrect(commentedFileConfig)) - { + if (!this.modConfig.getSpec().isCorrect(commentedFileConfig)) { LOGGER.warn(CONFIG, "Configuration file {} is not correct. Correcting", commentedFileConfig.getFile().getAbsolutePath()); ConfigFileTypeHandler.backUpConfig(commentedFileConfig); this.modConfig.getSpec().correct(commentedFileConfig); commentedFileConfig.save(); } - } - catch (ParsingException ex) - { + } catch (ParsingException ex) { throw new ConfigLoadingException(modConfig, ex); } LOGGER.debug(CONFIG, "Config file {} changed, sending notifies", this.modConfig.getFileName()); @@ -172,10 +153,8 @@ public void run() { } } - private static class ConfigLoadingException extends RuntimeException - { - public ConfigLoadingException(ModConfig config, Exception cause) - { + private static class ConfigLoadingException extends RuntimeException { + public ConfigLoadingException(ModConfig config, Exception cause) { super("Failed loading config file " + config.getFileName() + " of type " + config.getType() + " for modid " + config.getModId(), cause); } } diff --git a/loader/src/main/java/net/neoforged/fml/config/ConfigTracker.java b/loader/src/main/java/net/neoforged/fml/config/ConfigTracker.java index 88ae85256..7c91a33b5 100644 --- a/loader/src/main/java/net/neoforged/fml/config/ConfigTracker.java +++ b/loader/src/main/java/net/neoforged/fml/config/ConfigTracker.java @@ -9,15 +9,19 @@ import com.electronwill.nightconfig.core.file.CommentedFileConfig; import com.mojang.logging.LogUtils; import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.EnumMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.Marker; import org.slf4j.MarkerFactory; -import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - public class ConfigTracker { private static final Logger LOGGER = LogUtils.getLogger(); static final Marker CONFIG = MarkerFactory.getMarker("CONFIG"); @@ -38,12 +42,12 @@ private ConfigTracker() { void trackConfig(final ModConfig config) { if (this.fileMap.containsKey(config.getFileName())) { - LOGGER.error(CONFIG,"Detected config file conflict {} between {} and {}", config.getFileName(), this.fileMap.get(config.getFileName()).getModId(), config.getModId()); + LOGGER.error(CONFIG, "Detected config file conflict {} between {} and {}", config.getFileName(), this.fileMap.get(config.getFileName()).getModId(), config.getModId()); throw new RuntimeException("Config conflict detected!"); } this.fileMap.put(config.getFileName(), config); this.configSets.get(config.getType()).add(config); - this.configsByMod.computeIfAbsent(config.getModId(), (k)->new EnumMap<>(ModConfig.Type.class)).put(config.getType(), config); + this.configsByMod.computeIfAbsent(config.getModId(), (k) -> new EnumMap<>(ModConfig.Type.class)).put(config.getType(), config); LOGGER.debug(CONFIG, "Config file {} for {} tracking", config.getFileName(), config.getModId()); } @@ -104,8 +108,7 @@ public void loadDefaultServerConfigs() { } public String getConfigFileName(String modId, ModConfig.Type type) { - return Optional.ofNullable(configsByMod.getOrDefault(modId, Collections.emptyMap()).getOrDefault(type, null)). - map(ModConfig::getFullPath).map(Object::toString).orElse(null); + return Optional.ofNullable(configsByMod.getOrDefault(modId, Collections.emptyMap()).getOrDefault(type, null)).map(ModConfig::getFullPath).map(Object::toString).orElse(null); } public Map> configSets() { diff --git a/loader/src/main/java/net/neoforged/fml/config/IConfigEvent.java b/loader/src/main/java/net/neoforged/fml/config/IConfigEvent.java index b264914a7..4d68271f5 100644 --- a/loader/src/main/java/net/neoforged/fml/config/IConfigEvent.java +++ b/loader/src/main/java/net/neoforged/fml/config/IConfigEvent.java @@ -5,12 +5,10 @@ package net.neoforged.fml.config; +import java.util.function.Function; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.Bindings; - -import java.util.function.Function; - import org.jetbrains.annotations.Nullable; public interface IConfigEvent { @@ -21,12 +19,16 @@ record ConfigConfig(Function loading, Function spec; private final String fileName; @@ -67,11 +65,11 @@ void setConfigData(final CommentedConfig configData) { } public void save() { - ((FileConfig)this.configData).save(); + ((FileConfig) this.configData).save(); } public Path getFullPath() { - return ((FileConfig)this.configData).getNioPath(); + return ((FileConfig) this.configData).getNioPath(); } public void acceptSyncedConfig(byte[] bytes) { diff --git a/loader/src/main/java/net/neoforged/fml/core/ModStateProvider.java b/loader/src/main/java/net/neoforged/fml/core/ModStateProvider.java index 585aa2f07..b55d292a0 100644 --- a/loader/src/main/java/net/neoforged/fml/core/ModStateProvider.java +++ b/loader/src/main/java/net/neoforged/fml/core/ModStateProvider.java @@ -5,6 +5,7 @@ package net.neoforged.fml.core; +import java.util.List; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.IModLoadingState; import net.neoforged.fml.IModStateProvider; @@ -24,8 +25,6 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLPaths; -import java.util.List; - /** * Provider for the core FML mod loading states. */ diff --git a/loader/src/main/java/net/neoforged/fml/core/ParallelTransition.java b/loader/src/main/java/net/neoforged/fml/core/ParallelTransition.java index 076e618c8..4db2c015f 100644 --- a/loader/src/main/java/net/neoforged/fml/core/ParallelTransition.java +++ b/loader/src/main/java/net/neoforged/fml/core/ParallelTransition.java @@ -6,17 +6,16 @@ package net.neoforged.fml.core; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import net.neoforged.fml.IModStateTransition; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.ModLoadingStage; -import net.neoforged.fml.ThreadSelector; -import net.neoforged.fml.event.lifecycle.ParallelDispatchEvent; - import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.BiFunction; import java.util.function.Supplier; import java.util.stream.Stream; +import net.neoforged.fml.IModStateTransition; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModLoadingStage; +import net.neoforged.fml.ThreadSelector; +import net.neoforged.fml.event.lifecycle.ParallelDispatchEvent; record ParallelTransition(ModLoadingStage stage, Class event) implements IModStateTransition { @Override diff --git a/loader/src/main/java/net/neoforged/fml/event/IModBusEvent.java b/loader/src/main/java/net/neoforged/fml/event/IModBusEvent.java index 813569ed1..e1f1d0891 100644 --- a/loader/src/main/java/net/neoforged/fml/event/IModBusEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/IModBusEvent.java @@ -8,5 +8,4 @@ /** * Marker interface for events dispatched on the ModLifecycle event bus instead of the primary event bus */ -public interface IModBusEvent { -} +public interface IModBusEvent {} diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLClientSetupEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLClientSetupEvent.java index eb27b6a79..d2a9ad376 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLClientSetupEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLClientSetupEvent.java @@ -8,7 +8,6 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModLoadingStage; - /** * This is the second of four commonly called events during mod lifecycle startup. * @@ -23,10 +22,8 @@ * * This is a parallel dispatch event. */ -public class FMLClientSetupEvent extends ParallelDispatchEvent -{ - public FMLClientSetupEvent(ModContainer container, ModLoadingStage stage) - { +public class FMLClientSetupEvent extends ParallelDispatchEvent { + public FMLClientSetupEvent(ModContainer container, ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLCommonSetupEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLCommonSetupEvent.java index 323e058d3..056d0931f 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLCommonSetupEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLCommonSetupEvent.java @@ -5,16 +5,15 @@ package net.neoforged.fml.event.lifecycle; -import net.neoforged.fml.ModContainer; +import java.util.function.Consumer; import net.neoforged.fml.DeferredWorkQueue; +import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModLoadingStage; -import java.util.function.Consumer; - /** * This is the first of four commonly called events during mod initialization. * - * Called after {@link net.neoforged.registries.RegisterEvent} events have been fired and before + * Called after {@link net.neoforged.registries.RegisterEvent} events have been fired and before * {@link FMLClientSetupEvent} or {@link FMLDedicatedServerSetupEvent} during mod startup. * * Either register your listener using {@link net.neoforged.fml.javafmlmod.AutomaticEventSubscriber} and @@ -25,12 +24,10 @@ * interact with game state in this event. * * @see DeferredWorkQueue to enqueue work to run on the main game thread after this event has - * completed dispatch + * completed dispatch */ -public class FMLCommonSetupEvent extends ParallelDispatchEvent -{ - public FMLCommonSetupEvent(final ModContainer container, final ModLoadingStage stage) - { +public class FMLCommonSetupEvent extends ParallelDispatchEvent { + public FMLCommonSetupEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java index db2667552..ff8543bf0 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java @@ -26,10 +26,8 @@ * * This is a parallel dispatch event. */ -public class FMLDedicatedServerSetupEvent extends ParallelDispatchEvent -{ - public FMLDedicatedServerSetupEvent(ModContainer container, ModLoadingStage stage) - { +public class FMLDedicatedServerSetupEvent extends ParallelDispatchEvent { + public FMLDedicatedServerSetupEvent(ModContainer container, ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLLoadCompleteEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLLoadCompleteEvent.java index ee6542435..92a20da19 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLLoadCompleteEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/FMLLoadCompleteEvent.java @@ -14,10 +14,8 @@ * * @author cpw */ -public class FMLLoadCompleteEvent extends ParallelDispatchEvent -{ - public FMLLoadCompleteEvent(final ModContainer container, final ModLoadingStage stage) - { +public class FMLLoadCompleteEvent extends ParallelDispatchEvent { + public FMLLoadCompleteEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModEnqueueEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModEnqueueEvent.java index 8fdc448d5..2c05fa8e2 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModEnqueueEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModEnqueueEvent.java @@ -20,11 +20,8 @@ * * This is a parallel dispatch event. */ -public class InterModEnqueueEvent extends ParallelDispatchEvent -{ - - public InterModEnqueueEvent(final ModContainer container, final ModLoadingStage stage) - { +public class InterModEnqueueEvent extends ParallelDispatchEvent { + public InterModEnqueueEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModProcessEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModProcessEvent.java index a5a5b3c99..0f3bb6151 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModProcessEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/InterModProcessEvent.java @@ -5,12 +5,11 @@ package net.neoforged.fml.event.lifecycle; +import java.util.function.Predicate; import net.neoforged.fml.InterModComms; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModLoadingStage; -import java.util.function.Predicate; - /** * This is the fourth of four commonly called events during mod core startup. * @@ -24,10 +23,8 @@ * @see #getIMCStream() * @see #getIMCStream(Predicate) */ -public class InterModProcessEvent extends ParallelDispatchEvent -{ - public InterModProcessEvent(final ModContainer container, final ModLoadingStage stage) - { +public class InterModProcessEvent extends ParallelDispatchEvent { + public InterModProcessEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/ModLifecycleEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/ModLifecycleEvent.java index 14ddd863d..5cc1b3be9 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/ModLifecycleEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/ModLifecycleEvent.java @@ -5,31 +5,27 @@ package net.neoforged.fml.event.lifecycle; +import java.util.function.Predicate; +import java.util.stream.Stream; import net.neoforged.bus.api.Event; import net.neoforged.fml.InterModComms; import net.neoforged.fml.ModContainer; import net.neoforged.fml.event.IModBusEvent; -import java.util.function.Predicate; -import java.util.stream.Stream; - /** * Parent type to all ModLifecycle events. This is based on Forge EventBus. They fire through the * ModContainer's eventbus instance. */ -public abstract class ModLifecycleEvent extends Event implements IModBusEvent -{ +public abstract class ModLifecycleEvent extends Event implements IModBusEvent { private final ModContainer container; - public ModLifecycleEvent(ModContainer container) - { + public ModLifecycleEvent(ModContainer container) { this.container = container; } - public final String description() - { - String cn = getClass().getName(); - return cn.substring(cn.lastIndexOf('.')+1); + public final String description() { + String cn = getClass().getName(); + return cn.substring(cn.lastIndexOf('.') + 1); } public Stream getIMCStream() { diff --git a/loader/src/main/java/net/neoforged/fml/event/lifecycle/ParallelDispatchEvent.java b/loader/src/main/java/net/neoforged/fml/event/lifecycle/ParallelDispatchEvent.java index 1c59b63ef..62b32e740 100644 --- a/loader/src/main/java/net/neoforged/fml/event/lifecycle/ParallelDispatchEvent.java +++ b/loader/src/main/java/net/neoforged/fml/event/lifecycle/ParallelDispatchEvent.java @@ -5,13 +5,12 @@ package net.neoforged.fml.event.lifecycle; -import net.neoforged.fml.DeferredWorkQueue; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.ModLoadingStage; - import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; +import net.neoforged.fml.DeferredWorkQueue; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModLoadingStage; public abstract class ParallelDispatchEvent extends ModLifecycleEvent { private final ModLoadingStage modLoadingStage; @@ -26,10 +25,10 @@ private Optional getQueue() { } public CompletableFuture enqueueWork(Runnable work) { - return getQueue().map(q->q.enqueueWork(getContainer(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); + return getQueue().map(q -> q.enqueueWork(getContainer(), work)).orElseThrow(() -> new RuntimeException("No work queue found!")); } public CompletableFuture enqueueWork(Supplier work) { - return getQueue().map(q->q.enqueueWork(getContainer(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); + return getQueue().map(q -> q.enqueueWork(getContainer(), work)).orElseThrow(() -> new RuntimeException("No work queue found!")); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/javafmlmod/AutomaticEventSubscriber.java b/loader/src/main/java/net/neoforged/fml/javafmlmod/AutomaticEventSubscriber.java index 499ec66fd..e7948051e 100644 --- a/loader/src/main/java/net/neoforged/fml/javafmlmod/AutomaticEventSubscriber.java +++ b/loader/src/main/java/net/neoforged/fml/javafmlmod/AutomaticEventSubscriber.java @@ -5,60 +5,51 @@ package net.neoforged.fml.javafmlmod; +import static net.neoforged.fml.Logging.LOADING; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.Bindings; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforgespi.language.ModFileScanData; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.moddiscovery.ModAnnotation; +import net.neoforged.neoforgespi.language.ModFileScanData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.Type; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import static net.neoforged.fml.Logging.LOADING; - /** * Automatic eventbus subscriber - reads {@link Mod.EventBusSubscriber} * annotations and passes the class instances to the {@link Mod.EventBusSubscriber.Bus} * defined by the annotation. Defaults to {@code NeoForge#EVENT_BUS} */ -public class AutomaticEventSubscriber -{ +public class AutomaticEventSubscriber { private static final Logger LOGGER = LogManager.getLogger(); private static final Type AUTO_SUBSCRIBER = Type.getType(Mod.EventBusSubscriber.class); private static final Type MOD_TYPE = Type.getType(Mod.class); - public static void inject(final ModContainer mod, final ModFileScanData scanData, final ClassLoader loader) - { + + public static void inject(final ModContainer mod, final ModFileScanData scanData, final ClassLoader loader) { if (scanData == null) return; - LOGGER.debug(LOADING,"Attempting to inject @EventBusSubscriber classes into the eventbus for {}", mod.getModId()); - List ebsTargets = scanData.getAnnotations().stream(). - filter(annotationData -> AUTO_SUBSCRIBER.equals(annotationData.annotationType())). - collect(Collectors.toList()); - Map modids = scanData.getAnnotations().stream(). - filter(annotationData -> MOD_TYPE.equals(annotationData.annotationType())). - collect(Collectors.toMap(a -> a.clazz().getClassName(), a -> (String)a.annotationData().get("value"))); + LOGGER.debug(LOADING, "Attempting to inject @EventBusSubscriber classes into the eventbus for {}", mod.getModId()); + List ebsTargets = scanData.getAnnotations().stream().filter(annotationData -> AUTO_SUBSCRIBER.equals(annotationData.annotationType())).collect(Collectors.toList()); + Map modids = scanData.getAnnotations().stream().filter(annotationData -> MOD_TYPE.equals(annotationData.annotationType())).collect(Collectors.toMap(a -> a.clazz().getClassName(), a -> (String) a.annotationData().get("value"))); ebsTargets.forEach(ad -> { @SuppressWarnings("unchecked") - final List sidesValue = (List)ad.annotationData(). - getOrDefault("value", Arrays.asList(new ModAnnotation.EnumHolder(null, "CLIENT"), new ModAnnotation.EnumHolder(null, "DEDICATED_SERVER"))); - final EnumSet sides = sidesValue.stream().map(eh -> Dist.valueOf(eh.getValue())). - collect(Collectors.toCollection(() -> EnumSet.noneOf(Dist.class))); - final String modId = (String)ad.annotationData().getOrDefault("modid", modids.getOrDefault(ad.clazz().getClassName(), mod.getModId())); - final ModAnnotation.EnumHolder busTargetHolder = (ModAnnotation.EnumHolder)ad.annotationData().getOrDefault("bus", new ModAnnotation.EnumHolder(null, "FORGE")); + final List sidesValue = (List) ad.annotationData().getOrDefault("value", Arrays.asList(new ModAnnotation.EnumHolder(null, "CLIENT"), new ModAnnotation.EnumHolder(null, "DEDICATED_SERVER"))); + final EnumSet sides = sidesValue.stream().map(eh -> Dist.valueOf(eh.getValue())).collect(Collectors.toCollection(() -> EnumSet.noneOf(Dist.class))); + final String modId = (String) ad.annotationData().getOrDefault("modid", modids.getOrDefault(ad.clazz().getClassName(), mod.getModId())); + final ModAnnotation.EnumHolder busTargetHolder = (ModAnnotation.EnumHolder) ad.annotationData().getOrDefault("bus", new ModAnnotation.EnumHolder(null, "FORGE")); final Mod.EventBusSubscriber.Bus busTarget = Mod.EventBusSubscriber.Bus.valueOf(busTargetHolder.getValue()); if (Objects.equals(mod.getModId(), modId) && sides.contains(FMLEnvironment.dist)) { - try - { + try { IEventBus bus = switch (busTarget) { case FORGE -> Bindings.getForgeBus().get(); case MOD -> mod.getEventBus(); @@ -69,14 +60,11 @@ public static void inject(final ModContainer mod, final ModFileScanData scanData bus.register(Class.forName(ad.clazz().getClassName(), true, loader)); } - } - catch (ClassNotFoundException e) - { + } catch (ClassNotFoundException e) { LOGGER.fatal(LOADING, "Failed to load mod class {} for @EventBusSubscriber annotation", ad.clazz(), e); throw new RuntimeException(e); } } }); } - } diff --git a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLanguageProvider.java b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLanguageProvider.java index 4efd458f1..feb052712 100644 --- a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLanguageProvider.java +++ b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLanguageProvider.java @@ -5,22 +5,20 @@ package net.neoforged.fml.javafmlmod; -import net.neoforged.neoforgespi.language.IModLanguageProvider; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.language.ModFileScanData; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.objectweb.asm.Type; +import static net.neoforged.fml.Logging.SCAN; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.IModLanguageProvider; +import net.neoforged.neoforgespi.language.ModFileScanData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.objectweb.asm.Type; -import static net.neoforged.fml.Logging.SCAN; - -public class FMLJavaModLanguageProvider implements IModLanguageProvider -{ +public class FMLJavaModLanguageProvider implements IModLanguageProvider { private static final Logger LOGGER = LogManager.getLogger(); private static class FMLModTarget implements IModLanguageProvider.IModLanguageLoader { @@ -28,21 +26,18 @@ private static class FMLModTarget implements IModLanguageProvider.IModLanguageLo private final String className; private final String modId; - private FMLModTarget(String className, String modId) - { + private FMLModTarget(String className, String modId) { this.className = className; this.modId = modId; } - public String getModId() - { + public String getModId() { return modId; } @SuppressWarnings("unchecked") @Override - public T loadMod(final IModInfo info, final ModFileScanData modFileScanResults, ModuleLayer gameLayer) - { + public T loadMod(final IModInfo info, final ModFileScanData modFileScanResults, ModuleLayer gameLayer) { return (T) new FMLModContainer(info, className, modFileScanResults, gameLayer); } } @@ -50,8 +45,7 @@ public T loadMod(final IModInfo info, final ModFileScanData modFileScanResul public static final Type MODANNOTATION = Type.getType("Lnet/neoforged/fml/common/Mod;"); @Override - public String name() - { + public String name() { return "javafml"; } @@ -61,8 +55,8 @@ public Consumer getFileVisitor() { final Map modTargetMap = scanResult.getAnnotations().stream() .filter(ad -> ad.annotationType().equals(MODANNOTATION)) .peek(ad -> LOGGER.debug(SCAN, "Found @Mod class {} with id {}", ad.clazz().getClassName(), ad.annotationData().get("value"))) - .map(ad -> new FMLModTarget(ad.clazz().getClassName(), (String)ad.annotationData().get("value"))) - .collect(Collectors.toMap(FMLModTarget::getModId, Function.identity(), (a,b)->a)); + .map(ad -> new FMLModTarget(ad.clazz().getClassName(), (String) ad.annotationData().get("value"))) + .collect(Collectors.toMap(FMLModTarget::getModId, Function.identity(), (a, b) -> a)); scanResult.addLanguageLoader(modTargetMap); }; } diff --git a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLoadingContext.java b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLoadingContext.java index 37865e33a..eb9aa7a34 100644 --- a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLoadingContext.java +++ b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLJavaModLoadingContext.java @@ -9,8 +9,7 @@ import net.neoforged.fml.ModLoadingContext; @Deprecated(forRemoval = true) -public class FMLJavaModLoadingContext -{ +public class FMLJavaModLoadingContext { private final FMLModContainer container; FMLJavaModLoadingContext(FMLModContainer container) { @@ -21,14 +20,13 @@ public class FMLJavaModLoadingContext * @deprecated You can directly receive the event bus as a mod constructor argument. * @return The mod's event bus, to allow subscription to Mod specific events */ - public IEventBus getModEventBus() - { + public IEventBus getModEventBus() { return container.getEventBus(); } - /** * Helper to get the right instance from the {@link ModLoadingContext} correctly. + * * @return The FMLJavaMod language specific extension from the ModLoadingContext */ public static FMLJavaModLoadingContext get() { diff --git a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLModContainer.java b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLModContainer.java index 5830fc710..3e594b762 100644 --- a/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLModContainer.java +++ b/loader/src/main/java/net/neoforged/fml/javafmlmod/FMLModContainer.java @@ -5,6 +5,11 @@ package net.neoforged.fml.javafmlmod; +import java.lang.reflect.InvocationTargetException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.EventBusErrorMessage; import net.neoforged.bus.api.BusBuilder; @@ -23,14 +28,7 @@ import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; -import java.lang.reflect.InvocationTargetException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -public class FMLModContainer extends ModContainer -{ +public class FMLModContainer extends ModContainer { private static final Logger LOGGER = LogManager.getLogger(); private static final Marker LOADING = MarkerManager.getMarker("LOADING"); private final ModFileScanData scanResults; @@ -38,10 +36,9 @@ public class FMLModContainer extends ModContainer private Object modInstance; private final Class modClass; - public FMLModContainer(IModInfo info, String className, ModFileScanData modFileScanResults, ModuleLayer gameLayer) - { + public FMLModContainer(IModInfo info, String className, ModFileScanData modFileScanResults, ModuleLayer gameLayer) { super(info); - LOGGER.debug(LOADING,"Creating FMLModContainer instance for {}", className); + LOGGER.debug(LOADING, "Creating FMLModContainer instance for {}", className); this.scanResults = modFileScanResults; activityMap.put(ModLoadingStage.CONSTRUCT, this::constructMod); this.eventBus = BusBuilder.builder() @@ -51,28 +48,22 @@ public FMLModContainer(IModInfo info, String className, ModFileScanData modFileS .build(); final FMLJavaModLoadingContext contextExtension = new FMLJavaModLoadingContext(this); this.contextExtension = () -> contextExtension; - try - { + try { var layer = gameLayer.findModule(info.getOwningFile().moduleName()).orElseThrow(); modClass = Class.forName(layer, className); - LOGGER.trace(LOADING,"Loaded modclass {} with {}", modClass.getName(), modClass.getClassLoader()); - } - catch (Throwable e) - { + LOGGER.trace(LOADING, "Loaded modclass {} with {}", modClass.getName(), modClass.getClassLoader()); + } catch (Throwable e) { LOGGER.error(LOADING, "Failed to load class {}", className, e); throw new ModLoadingException(info, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmodclass", e); } } - private void onEventFailed(IEventBus iEventBus, Event event, EventListener[] iEventListeners, int i, Throwable throwable) - { + private void onEventFailed(IEventBus iEventBus, Event event, EventListener[] iEventListeners, int i, Throwable throwable) { LOGGER.error(new EventBusErrorMessage(event, i, iEventListeners, throwable)); } - private void constructMod() - { - try - { + private void constructMod() { + try { LOGGER.trace(LOADING, "Loading mod instance {} of type {}", getModId(), modClass.getName()); var constructors = modClass.getConstructors(); @@ -111,11 +102,9 @@ private void constructMod() this.modInstance = constructor.newInstance(constructorArgs); LOGGER.trace(LOADING, "Loaded mod instance {} of type {}", getModId(), modClass.getName()); - } - catch (Throwable e) - { + } catch (Throwable e) { if (e instanceof InvocationTargetException) e = e.getCause(); // exceptions thrown when a reflected method call throws are wrapped in an InvocationTargetException. However, this isn't useful for the end user who has to dig through the logs to find the actual cause. - LOGGER.error(LOADING,"Failed to create mod instance. ModID: {}, class {}", getModId(), modClass.getName(), e); + LOGGER.error(LOADING, "Failed to create mod instance. ModID: {}, class {}", getModId(), modClass.getName(), e); throw new ModLoadingException(modInfo, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmod", e, modClass); } try { @@ -123,26 +112,23 @@ private void constructMod() AutomaticEventSubscriber.inject(this, this.scanResults, this.modClass.getClassLoader()); LOGGER.trace(LOADING, "Completed Automatic event subscribers for {}", getModId()); } catch (Throwable e) { - LOGGER.error(LOADING,"Failed to register automatic subscribers. ModID: {}, class {}", getModId(), modClass.getName(), e); + LOGGER.error(LOADING, "Failed to register automatic subscribers. ModID: {}, class {}", getModId(), modClass.getName(), e); throw new ModLoadingException(modInfo, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmod", e, modClass); } } @Override - public boolean matches(Object mod) - { + public boolean matches(Object mod) { return mod == modInstance; } @Override - public Object getMod() - { + public Object getMod() { return modInstance; } @Override - public IEventBus getEventBus() - { + public IEventBus getEventBus() { return this.eventBus; } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/BackgroundWaiter.java b/loader/src/main/java/net/neoforged/fml/loading/BackgroundWaiter.java index bff25ed22..ed02a35b3 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/BackgroundWaiter.java +++ b/loader/src/main/java/net/neoforged/fml/loading/BackgroundWaiter.java @@ -20,8 +20,7 @@ public static void runAndTick(Runnable r, Runnable tick) { tick.run(); try { Thread.sleep(50); - } catch (InterruptedException ignored) { - } + } catch (InterruptedException ignored) {} } while (!work.isDone()); try { runner.shutdown(); diff --git a/loader/src/main/java/net/neoforged/fml/loading/ClasspathLocatorUtils.java b/loader/src/main/java/net/neoforged/fml/loading/ClasspathLocatorUtils.java index 3e70288e3..3ba64c74d 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ClasspathLocatorUtils.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ClasspathLocatorUtils.java @@ -6,16 +6,14 @@ package net.neoforged.fml.loading; import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; +import org.slf4j.Logger; public class ClasspathLocatorUtils { - private static final Logger LOGGER = LogUtils.getLogger(); public static Path findJarPathFor(final String resourceName, final String jarName, final URL resource) { @@ -26,13 +24,13 @@ public static Path findJarPathFor(final String resourceName, final String jarNam int lastExcl = uri.getRawSchemeSpecificPart().lastIndexOf("!/"); path = Paths.get(new URI(uri.getRawSchemeSpecificPart().substring(0, lastExcl))); } else { - path = Paths.get(new URI("file://"+uri.getRawSchemeSpecificPart().substring(0, uri.getRawSchemeSpecificPart().length()-resourceName.length()))); + path = Paths.get(new URI("file://" + uri.getRawSchemeSpecificPart().substring(0, uri.getRawSchemeSpecificPart().length() - resourceName.length()))); } //LOGGER.debug(CORE, "Found JAR {} at path {}", jarName, path.toString()); return path; } catch (NullPointerException | URISyntaxException e) { LOGGER.error(LogMarkers.SCAN, "Failed to find JAR for class {} - {}", resourceName, jarName); - throw new RuntimeException("Unable to locate "+resourceName+" - "+jarName, e); + throw new RuntimeException("Unable to locate " + resourceName + " - " + jarName, e); } } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/ClasspathTransformerDiscoverer.java b/loader/src/main/java/net/neoforged/fml/loading/ClasspathTransformerDiscoverer.java index 038e74908..da3c61f57 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ClasspathTransformerDiscoverer.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ClasspathTransformerDiscoverer.java @@ -5,22 +5,25 @@ package net.neoforged.fml.loading; +import static net.neoforged.fml.loading.TransformerDiscovererConstants.shouldLoadInServiceLayer; + import cpw.mods.modlauncher.api.NamedPath; import cpw.mods.modlauncher.serviceapi.ITransformerDiscoveryService; -import net.neoforged.fml.loading.targets.CommonLaunchHandler; -import org.apache.logging.log4j.LogManager; - import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; - -import static net.neoforged.fml.loading.TransformerDiscovererConstants.shouldLoadInServiceLayer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import net.neoforged.fml.loading.targets.CommonLaunchHandler; +import org.apache.logging.log4j.LogManager; public class ClasspathTransformerDiscoverer implements ITransformerDiscoveryService { - private final List legacyClasspath = Arrays.stream(System.getProperty("legacyClassPath", "").split(File.pathSeparator)).map(Path::of).toList(); @Override @@ -39,9 +42,9 @@ public List candidates(final Path gameDirectory, final String launchT private final static List found = new ArrayList<>(); public static List allExcluded() { - return found.stream().map(np->np.paths()[0]).toList(); + return found.stream().map(np -> np.paths()[0]).toList(); } - + private void scan(final Path gameDirectory) { try { for (final String serviceClass : TransformerDiscovererConstants.SERVICES) { @@ -73,5 +76,4 @@ private void scanModClasses() { } }); } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/EarlyLoadingException.java b/loader/src/main/java/net/neoforged/fml/loading/EarlyLoadingException.java index fd50c4a1c..e1179f866 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/EarlyLoadingException.java +++ b/loader/src/main/java/net/neoforged/fml/loading/EarlyLoadingException.java @@ -5,9 +5,8 @@ package net.neoforged.fml.loading; -import net.neoforged.neoforgespi.language.IModInfo; - import java.util.List; +import net.neoforged.neoforgespi.language.IModInfo; /** * Thrown during early loading phase, and collected by the LoadingModList for handoff to the client @@ -41,6 +40,7 @@ public IModInfo getModInfo() { return modInfo; } } + private final List errorMessages; public List getAllData() { @@ -51,6 +51,4 @@ public EarlyLoadingException(final String message, final Throwable originalExcep super(message, originalException); this.errorMessages = errorMessages; } - - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/FMLConfig.java b/loader/src/main/java/net/neoforged/fml/loading/FMLConfig.java index d360c5837..524503fce 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FMLConfig.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FMLConfig.java @@ -12,16 +12,14 @@ import com.electronwill.nightconfig.core.io.ParsingException; import com.electronwill.nightconfig.core.io.WritingMode; import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Objects; import java.util.function.Function; +import org.slf4j.Logger; -public class FMLConfig -{ +public class FMLConfig { public enum ConfigValue { DISABLE_CONFIG_WATCHER("disableConfigWatcher", Boolean.FALSE, "Disables File Watcher. Used to automatically update config if its file has been modified."), EARLY_WINDOW_CONTROL("earlyWindowControl", Boolean.TRUE, "Should we control the window. Disabling this disables new GL features and can be bad for mods that rely on them."), @@ -35,8 +33,7 @@ public enum ConfigValue { EARLY_WINDOW_FBSCALE("earlyWindowFBScale", 1, "Early window framebuffer scale"), EARLY_WINDOW_MAXIMIZED("earlyWindowMaximized", Boolean.FALSE, "Early window starts maximized"), EARLY_WINDOW_SKIP_GL_VERSIONS("earlyWindowSkipGLVersions", List.of(), "Skip specific GL versions, may help with buggy graphics card drivers"), - EARLY_WINDOW_SQUIR("earlyWindowSquir", Boolean.FALSE, "Squir?") - ; + EARLY_WINDOW_SQUIR("earlyWindowSquir", Boolean.FALSE, "Squir?"); private final String entry; private final Object defaultValue; @@ -47,6 +44,7 @@ public enum ConfigValue { ConfigValue(final String entry, final Object defaultValue, final String comment) { this(entry, defaultValue, comment, Function.identity()); } + ConfigValue(final String entry, final Object defaultValue, final String comment, Function entryFunction) { this.entry = entry; this.defaultValue = defaultValue; @@ -64,6 +62,7 @@ void buildConfigEntry(ConfigSpec spec, CommentedConfig commentedConfig) { commentedConfig.add(this.entry, this.defaultValue); commentedConfig.setComment(this.entry, this.comment); } + @SuppressWarnings("unchecked") private T getConfigValue(CommentedFileConfig config) { return (T) this.entryFunction.apply(config != null ? config.get(this.entry) : this.defaultValue); @@ -75,7 +74,7 @@ public void updateValue(final CommentedFileConfig configData, final T value) } private static Object maxThreads(final Object value) { - int val = (Integer)value; + int val = (Integer) value; if (val <= 0) return Runtime.getRuntime().availableProcessors(); else return val; } @@ -85,44 +84,37 @@ private static Object maxThreads(final Object value) { private static final ConfigSpec configSpec = new ConfigSpec(); private static final CommentedConfig configComments = CommentedConfig.inMemory(); static { - for (ConfigValue cv: ConfigValue.values()) { + for (ConfigValue cv : ConfigValue.values()) { cv.buildConfigEntry(configSpec, configComments); } } private CommentedFileConfig configData; - private void loadFrom(final Path configFile) - { + private void loadFrom(final Path configFile) { configData = CommentedFileConfig.builder(configFile).sync() .onFileNotFound(FileNotFoundAction.copyData(Objects.requireNonNull(getClass().getResourceAsStream("/META-INF/defaultfmlconfig.toml")))) .writingMode(WritingMode.REPLACE) .build(); - try - { + try { configData.load(); - } - catch (ParsingException e) - { + } catch (ParsingException e) { throw new RuntimeException("Failed to load FML config from " + configFile, e); } if (!configSpec.isCorrect(configData)) { LOGGER.warn(LogMarkers.CORE, "Configuration file {} is not correct. Correcting", configFile); - configSpec.correct(configData, (action, path, incorrectValue, correctedValue) -> - LOGGER.info(LogMarkers.CORE, "Incorrect key {} was corrected from {} to {}", path, incorrectValue, correctedValue)); + configSpec.correct(configData, (action, path, incorrectValue, correctedValue) -> LOGGER.info(LogMarkers.CORE, "Incorrect key {} was corrected from {} to {}", path, incorrectValue, correctedValue)); } configData.putAllComments(configComments); configData.save(); } - public static void load() - { + public static void load() { final Path configFile = FMLPaths.FMLCONFIG.get(); INSTANCE.loadFrom(configFile); - if (LOGGER.isTraceEnabled(LogMarkers.CORE)) - { + if (LOGGER.isTraceEnabled(LogMarkers.CORE)) { LOGGER.trace(LogMarkers.CORE, "Loaded FML config from {}", FMLPaths.FMLCONFIG.get()); - for (ConfigValue cv: ConfigValue.values()) { + for (ConfigValue cv : ConfigValue.values()) { LOGGER.trace(LogMarkers.CORE, "FMLConfig {} is {}", cv.entry, cv.getConfigValue(INSTANCE.configData)); } } @@ -144,6 +136,7 @@ public static int getIntConfigValue(ConfigValue v) { public static List getListConfigValue(ConfigValue v) { return v.getConfigValue(INSTANCE.configData); } + public static void updateConfig(ConfigValue v, T value) { if (INSTANCE.configData != null) { v.updateValue(INSTANCE.configData, value); diff --git a/loader/src/main/java/net/neoforged/fml/loading/FMLEnvironment.java b/loader/src/main/java/net/neoforged/fml/loading/FMLEnvironment.java index 089567b9f..5277f69e9 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FMLEnvironment.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FMLEnvironment.java @@ -7,22 +7,20 @@ import cpw.mods.modlauncher.api.IEnvironment; import cpw.mods.modlauncher.api.TypesafeMap; +import java.util.function.Supplier; import net.neoforged.api.distmarker.Dist; import net.neoforged.neoforgespi.Environment; -import java.util.function.Supplier; - -public class FMLEnvironment -{ +public class FMLEnvironment { public static final Dist dist = FMLLoader.getDist(); public static final boolean production = FMLLoader.isProduction() || System.getProperties().containsKey("production"); public static final boolean secureJarsEnabled = FMLLoader.isSecureJarEnabled(); static void setupInteropEnvironment(IEnvironment environment) { - environment.computePropertyIfAbsent(Environment.Keys.DIST.get(), v->dist); + environment.computePropertyIfAbsent(Environment.Keys.DIST.get(), v -> dist); } public static class Keys { - public static final Supplier> LOCATORCLASSLOADER = IEnvironment.buildKey("LOCATORCLASSLOADER",ClassLoader.class); + public static final Supplier> LOCATORCLASSLOADER = IEnvironment.buildKey("LOCATORCLASSLOADER", ClassLoader.class); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/FMLLoader.java b/loader/src/main/java/net/neoforged/fml/loading/FMLLoader.java index 45093b1d8..1bb8b8080 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FMLLoader.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FMLLoader.java @@ -7,10 +7,22 @@ import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.Launcher; -import cpw.mods.modlauncher.api.*; -import cpw.mods.modlauncher.util.ServiceLoaderUtils; +import cpw.mods.modlauncher.api.IEnvironment; +import cpw.mods.modlauncher.api.ILaunchHandlerService; +import cpw.mods.modlauncher.api.IModuleLayerManager; +import cpw.mods.modlauncher.api.ITransformationService; +import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import net.neoforged.accesstransformer.api.AccessTransformerEngine; import net.neoforged.accesstransformer.ml.AccessTransformerService; +import net.neoforged.api.distmarker.Dist; import net.neoforged.coremod.CoreModScriptingEngine; import net.neoforged.fml.common.asm.RuntimeDistCleaner; import net.neoforged.fml.loading.mixin.DeferredMixinConfigRegistration; @@ -18,20 +30,11 @@ import net.neoforged.fml.loading.moddiscovery.ModDiscoverer; import net.neoforged.fml.loading.moddiscovery.ModFile; import net.neoforged.fml.loading.moddiscovery.ModValidator; -import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.loading.targets.CommonLaunchHandler; import net.neoforged.neoforgespi.Environment; import org.slf4j.Logger; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; -import java.util.function.BiFunction; -import java.util.stream.Collectors; - -public class FMLLoader -{ +public class FMLLoader { private static final Logger LOGGER = LogUtils.getLogger(); private static AccessTransformerEngine accessTransformer; private static ModDiscoverer modDiscoverer; @@ -50,38 +53,37 @@ public class FMLLoader private static boolean production; private static IModuleLayerManager moduleLayerManager; - static void onInitialLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException - { + static void onInitialLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException { final String version = LauncherVersion.getVersion(); - LOGGER.debug(LogMarkers.CORE,"FML {} loading", version); + LOGGER.debug(LogMarkers.CORE, "FML {} loading", version); final Package modLauncherPackage = ITransformationService.class.getPackage(); - LOGGER.debug(LogMarkers.CORE,"FML found ModLauncher version : {}", modLauncherPackage.getImplementationVersion()); + LOGGER.debug(LogMarkers.CORE, "FML found ModLauncher version : {}", modLauncherPackage.getImplementationVersion()); if (!modLauncherPackage.isCompatibleWith("4.0")) { LOGGER.error(LogMarkers.CORE, "Found incompatible ModLauncher specification : {}, version {} from {}", modLauncherPackage.getSpecificationVersion(), modLauncherPackage.getImplementationVersion(), modLauncherPackage.getImplementationVendor()); - throw new IncompatibleEnvironmentException("Incompatible modlauncher found "+modLauncherPackage.getSpecificationVersion()); + throw new IncompatibleEnvironmentException("Incompatible modlauncher found " + modLauncherPackage.getSpecificationVersion()); } - accessTransformer = ((AccessTransformerService) environment.findLaunchPlugin("accesstransformer").orElseThrow(()-> { + accessTransformer = ((AccessTransformerService) environment.findLaunchPlugin("accesstransformer").orElseThrow(() -> { LOGGER.error(LogMarkers.CORE, "Access Transformer library is missing, we need this to run"); return new IncompatibleEnvironmentException("Missing AccessTransformer, cannot run"); })).engine; final Package atPackage = accessTransformer.getClass().getPackage(); - LOGGER.debug(LogMarkers.CORE,"FML found AccessTransformer version : {}", atPackage.getImplementationVersion()); + LOGGER.debug(LogMarkers.CORE, "FML found AccessTransformer version : {}", atPackage.getImplementationVersion()); if (!atPackage.isCompatibleWith("1.0")) { LOGGER.error(LogMarkers.CORE, "Found incompatible AccessTransformer specification : {}, version {} from {}", atPackage.getSpecificationVersion(), atPackage.getImplementationVersion(), atPackage.getImplementationVendor()); - throw new IncompatibleEnvironmentException("Incompatible accesstransformer found "+atPackage.getSpecificationVersion()); + throw new IncompatibleEnvironmentException("Incompatible accesstransformer found " + atPackage.getSpecificationVersion()); } try { var eventBus = Class.forName("net.neoforged.bus.api.IEventBus", false, environment.getClass().getClassLoader()); - LOGGER.debug(LogMarkers.CORE,"FML found EventBus version : {}", eventBus.getPackage().getImplementationVersion()); + LOGGER.debug(LogMarkers.CORE, "FML found EventBus version : {}", eventBus.getPackage().getImplementationVersion()); } catch (ClassNotFoundException e) { LOGGER.error(LogMarkers.CORE, "Event Bus library is missing, we need this to run"); throw new IncompatibleEnvironmentException("Missing EventBus, cannot run"); } - runtimeDistCleaner = (RuntimeDistCleaner)environment.findLaunchPlugin("runtimedistcleaner").orElseThrow(()-> { + runtimeDistCleaner = (RuntimeDistCleaner) environment.findLaunchPlugin("runtimedistcleaner").orElseThrow(() -> { LOGGER.error(LogMarkers.CORE, "Dist Cleaner is missing, we need this to run"); return new IncompatibleEnvironmentException("Missing DistCleaner, cannot run!"); }); @@ -106,8 +108,7 @@ static void onInitialLoad(IEnvironment environment, Set otherServices) t } } - static void setupLaunchHandler(final IEnvironment environment, final Map arguments) - { + static void setupLaunchHandler(final IEnvironment environment, final Map arguments) { final String launchTarget = environment.getProperty(IEnvironment.Keys.LAUNCHTARGET.get()).orElse("MISSING"); arguments.put("launchTarget", launchTarget); final Optional launchHandler = environment.findLaunchHandler(launchTarget); @@ -121,7 +122,7 @@ static void setupLaunchHandler(final IEnvironment environment, final Map beginModScan(final Map arguments) - { - LOGGER.debug(LogMarkers.SCAN,"Scanning for Mod Locators"); + + public static List beginModScan(final Map arguments) { + LOGGER.debug(LogMarkers.SCAN, "Scanning for Mod Locators"); modDiscoverer = new ModDiscoverer(arguments); modValidator = modDiscoverer.discoverMods(); var pluginResources = modValidator.getPluginResources(); @@ -159,8 +160,7 @@ static CoreModScriptingEngine getCoreModEngine() { return coreModEngine; } - public static LanguageLoadingProvider getLanguageLoadingProvider() - { + public static LanguageLoadingProvider getLanguageLoadingProvider() { return languageLoadingProvider; } @@ -172,8 +172,7 @@ public static CommonLaunchHandler getLaunchHandler() { return commonLaunchHandler; } - public static void addAccessTransformer(Path atPath, ModFile modName) - { + public static void addAccessTransformer(Path atPath, ModFile modName) { LOGGER.debug(LogMarkers.SCAN, "Adding Access Transformer in {}", modName.getFilePath()); try { accessTransformer.loadATFromPath(atPath); @@ -182,25 +181,21 @@ public static void addAccessTransformer(Path atPath, ModFile modName) } } - public static Dist getDist() - { + public static Dist getDist() { return dist; } - public static void beforeStart(ModuleLayer gameLayer) - { + public static void beforeStart(ModuleLayer gameLayer) { ImmediateWindowHandler.acceptGameLayer(gameLayer); ImmediateWindowHandler.updateProgress("Launching minecraft"); progressWindowTick.run(); } - public static LoadingModList getLoadingModList() - { + public static LoadingModList getLoadingModList() { return loadingModList; } - public static Path getGamePath() - { + public static Path getGamePath() { return gamePath; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/FMLPaths.java b/loader/src/main/java/net/neoforged/fml/loading/FMLPaths.java index ce9f75080..180797dd0 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FMLPaths.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FMLPaths.java @@ -5,21 +5,19 @@ package net.neoforged.fml.loading; +import static net.neoforged.fml.loading.LogMarkers.CORE; + import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.api.IEnvironment; -import org.slf4j.Logger; - import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import org.slf4j.Logger; -import static net.neoforged.fml.loading.LogMarkers.CORE; - -public enum FMLPaths -{ +public enum FMLPaths { GAMEDIR(), MODSDIR("mods"), CONFIGDIR("config"), @@ -44,8 +42,7 @@ public enum FMLPaths this.isDirectory = isDir; } - private Path computePath(String... path) - { + private Path computePath(String... path) { return Paths.get(path[0], Arrays.copyOfRange(path, 1, path.length)); } @@ -55,21 +52,17 @@ public static void setup(IEnvironment env) { loadAbsolutePaths(rootPath); } - public static void loadAbsolutePaths(Path rootPath) - { - for (FMLPaths path : FMLPaths.values()) - { + public static void loadAbsolutePaths(Path rootPath) { + for (FMLPaths path : FMLPaths.values()) { path.absolutePath = rootPath.resolve(path.relativePath).toAbsolutePath().normalize(); - if (path.isDirectory && !Files.isDirectory(path.absolutePath)) - { + if (path.isDirectory && !Files.isDirectory(path.absolutePath)) { try { - Files.createDirectories(path.absolutePath); + Files.createDirectories(path.absolutePath); } catch (IOException ioe) { throw new UncheckedIOException(ioe); } } - if (LOGGER.isDebugEnabled(CORE)) - { + if (LOGGER.isDebugEnabled(CORE)) { LOGGER.debug(CORE, "Path {} is {}", path, path.absolutePath); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/FMLServiceProvider.java b/loader/src/main/java/net/neoforged/fml/loading/FMLServiceProvider.java index 5391667ba..d141b3df8 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FMLServiceProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FMLServiceProvider.java @@ -5,16 +5,14 @@ package net.neoforged.fml.loading; -import com.mojang.logging.LogUtils; -import cpw.mods.modlauncher.api.*; -import joptsimple.ArgumentAcceptingOptionSpec; -import joptsimple.OptionSpecBuilder; -import net.neoforged.fml.loading.moddiscovery.ModFile; -import net.neoforged.neoforgespi.Environment; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; +import static net.neoforged.fml.loading.LogMarkers.CORE; -import java.util.ArrayList; +import com.mojang.logging.LogUtils; +import cpw.mods.modlauncher.api.IEnvironment; +import cpw.mods.modlauncher.api.IModuleLayerManager; +import cpw.mods.modlauncher.api.ITransformationService; +import cpw.mods.modlauncher.api.ITransformer; +import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -22,10 +20,13 @@ import java.util.Map; import java.util.Set; import java.util.function.BiFunction; -import static net.neoforged.fml.loading.LogMarkers.CORE; +import joptsimple.ArgumentAcceptingOptionSpec; +import joptsimple.OptionSpecBuilder; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.neoforgespi.Environment; +import org.slf4j.Logger; -public class FMLServiceProvider implements ITransformationService -{ +public class FMLServiceProvider implements ITransformationService { private static final Logger LOGGER = LogUtils.getLogger(); private ArgumentAcceptingOptionSpec modsOption; private ArgumentAcceptingOptionSpec modListsOption; @@ -47,15 +48,13 @@ public class FMLServiceProvider implements ITransformationService private String targetMcpMappings; private Map arguments; - public FMLServiceProvider() - { + public FMLServiceProvider() { final String markerselection = System.getProperty("forge.logging.markers", ""); Arrays.stream(markerselection.split(",")).forEach(marker -> System.setProperty("forge.logging.marker." + marker.toLowerCase(Locale.ROOT), "ACCEPT")); } @Override - public String name() - { + public String name() { return "fml"; } @@ -66,7 +65,7 @@ public void initialize(IEnvironment environment) { LOGGER.debug(CORE, "Loading configuration"); FMLConfig.load(); LOGGER.debug(CORE, "Preparing ModFile"); - environment.computePropertyIfAbsent(Environment.Keys.MODFILEFACTORY.get(), k->ModFile::new); + environment.computePropertyIfAbsent(Environment.Keys.MODFILEFACTORY.get(), k -> ModFile::new); arguments = new HashMap<>(); arguments.put("modLists", modListsArgumentList); arguments.put("mods", modsArgumentList); @@ -84,7 +83,7 @@ public void initialize(IEnvironment environment) { @Override public List beginScanning(final IEnvironment environment) { - LOGGER.debug(CORE,"Initiating mod scan"); + LOGGER.debug(CORE, "Initiating mod scan"); return FMLLoader.beginModScan(arguments); } @@ -94,8 +93,7 @@ public List completeScan(final IModuleLayerManager layerManager) { } @Override - public void onLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException - { + public void onLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException { // LOGGER.debug("Injecting tracing printstreams for STDOUT/STDERR."); // System.setOut(new TracingPrintStream(LogManager.getLogger("STDOUT"), System.out)); // System.setErr(new TracingPrintStream(LogManager.getLogger("STDERR"), System.err)); @@ -103,8 +101,7 @@ public void onLoad(IEnvironment environment, Set otherServices) throws I } @Override - public void arguments(BiFunction argumentBuilder) - { + public void arguments(BiFunction argumentBuilder) { forgeOption = argumentBuilder.apply("neoForgeVersion", "Forge Version number").withRequiredArg().ofType(String.class).required(); fmlOption = argumentBuilder.apply("fmlVersion", "FML Version number").withRequiredArg().ofType(String.class).required(); mcOption = argumentBuilder.apply("mcVersion", "Minecraft Version number").withRequiredArg().ofType(String.class).required(); @@ -117,8 +114,7 @@ public void arguments(BiFunction argumentBuil } @Override - public void argumentValues(OptionResult option) - { + public void argumentValues(OptionResult option) { modsArgumentList = option.values(modsOption); modListsArgumentList = option.values(modListsOption); mavenRootsArgumentList = option.values(mavenRootsOption); @@ -131,10 +127,8 @@ public void argumentValues(OptionResult option) } @Override - public @NotNull List> transformers() - { + public List> transformers() { LOGGER.debug(CORE, "Loading coremod transformers"); return FMLLoader.getCoreModEngine().initializeCoreMods(); } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/FileUtils.java b/loader/src/main/java/net/neoforged/fml/loading/FileUtils.java index 57ba017f8..6929fa9ff 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/FileUtils.java +++ b/loader/src/main/java/net/neoforged/fml/loading/FileUtils.java @@ -7,14 +7,12 @@ import java.nio.file.Path; -public class FileUtils -{ - +public class FileUtils { public static String fileExtension(final Path path) { String fileName = path.getFileName().toString(); int idx = fileName.lastIndexOf('.'); if (idx > -1) { - return fileName.substring(idx+1); + return fileName.substring(idx + 1); } else { return ""; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowHandler.java b/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowHandler.java index 4679ba028..3de8245d4 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowHandler.java @@ -7,6 +7,20 @@ import cpw.mods.modlauncher.Launcher; import cpw.mods.modlauncher.api.IModuleLayerManager.Layer; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; +import java.util.function.LongSupplier; +import java.util.function.Supplier; +import java.util.stream.Collectors; import net.neoforged.fml.loading.progress.ProgressMeter; import net.neoforged.fml.loading.progress.StartupNotificationManager; import net.neoforged.neoforgespi.earlywindow.GraphicsBootstrapper; @@ -14,18 +28,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.*; -import java.util.function.*; -import java.util.stream.Collectors; - public class ImmediateWindowHandler { private static final Logger LOGGER = LogManager.getLogger(); private static ImmediateWindowProvider provider; private static ProgressMeter earlyProgress; + public static void load(final String launchTarget, final String[] arguments) { final var layer = Launcher.INSTANCE.findLayerManager() .flatMap(manager -> manager.getLayer(Layer.SERVICE)) @@ -68,7 +77,7 @@ public static long setupMinecraftWindow(final IntSupplier width, final IntSuppli return provider.setupMinecraftWindow(width, height, title, monitor); } - public static boolean positionWindow(Optional monitor,IntConsumer widthSetter, IntConsumer heightSetter, IntConsumer xSetter, IntConsumer ySetter) { + public static boolean positionWindow(Optional monitor, IntConsumer widthSetter, IntConsumer heightSetter, IntConsumer xSetter, IntConsumer ySetter) { return provider.positionWindow(monitor, widthSetter, heightSetter, xSetter, ySetter); } @@ -92,6 +101,7 @@ public static void renderTick() { public static String getGLVersion() { return provider.getGLVersion(); } + public static void updateProgress(final String message) { earlyProgress.label(message); } @@ -117,13 +127,12 @@ public Runnable initialize(String[] args) { } @Override - public void updateFramebufferSize(final IntConsumer width, final IntConsumer height) { - } + public void updateFramebufferSize(final IntConsumer width, final IntConsumer height) {} @Override public long setupMinecraftWindow(final IntSupplier width, final IntSupplier height, final Supplier title, final LongSupplier monitor) { try { - var longsupplier = (LongSupplier)NV_HANDOFF.invoke(null, width, height, title, monitor); + var longsupplier = (LongSupplier) NV_HANDOFF.invoke(null, width, height, title, monitor); return longsupplier.getAsLong(); } catch (Throwable e) { throw new IllegalStateException("How did you get here?", e); @@ -132,11 +141,12 @@ public long setupMinecraftWindow(final IntSupplier width, final IntSupplier heig public boolean positionWindow(Optional monitor, IntConsumer widthSetter, IntConsumer heightSetter, IntConsumer xSetter, IntConsumer ySetter) { try { - return (boolean)NV_POSITION.invoke(null, monitor, widthSetter, heightSetter, xSetter, ySetter); + return (boolean) NV_POSITION.invoke(null, monitor, widthSetter, heightSetter, xSetter, ySetter); } catch (Throwable e) { throw new IllegalStateException("How did you get here?", e); } } + @SuppressWarnings("unchecked") public Supplier loadingOverlay(Supplier mc, Supplier ri, Consumer> ex, boolean fade) { try { diff --git a/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowProvider.java b/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowProvider.java index dae191e7f..79a5d280d 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ImmediateWindowProvider.java @@ -13,5 +13,4 @@ * instead. */ @Deprecated(since = "2.0.16", forRemoval = true) -public interface ImmediateWindowProvider extends net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider -{ } +public interface ImmediateWindowProvider extends net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider {} diff --git a/loader/src/main/java/net/neoforged/fml/loading/JarVersionLookupHandler.java b/loader/src/main/java/net/neoforged/fml/loading/JarVersionLookupHandler.java index 49c65e985..cb8d426de 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/JarVersionLookupHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/JarVersionLookupHandler.java @@ -35,7 +35,6 @@ public static Optional getImplementationTitle(final Class clazz) { return Optional.ofNullable(pkgVersion); } - public static Optional getSpecificationVersion(final Class clazz) { // With java 9 we'll use the module's version if it exists in preference. final String pkgVersion = clazz.getPackage().getSpecificationVersion(); diff --git a/loader/src/main/java/net/neoforged/fml/loading/LanguageLoadingProvider.java b/loader/src/main/java/net/neoforged/fml/loading/LanguageLoadingProvider.java index ecdbba405..40b8ad5bc 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LanguageLoadingProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LanguageLoadingProvider.java @@ -9,14 +9,6 @@ import cpw.mods.modlauncher.Launcher; import cpw.mods.modlauncher.api.IModuleLayerManager; import cpw.mods.modlauncher.util.ServiceLoaderUtils; -import net.neoforged.neoforgespi.language.IModLanguageProvider; -import net.neoforged.fml.loading.moddiscovery.ExplodedDirectoryLocator; -import net.neoforged.fml.loading.moddiscovery.ModFile; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.artifact.versioning.DefaultArtifactVersion; -import org.apache.maven.artifact.versioning.VersionRange; -import org.slf4j.Logger; - import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,17 +23,22 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; +import net.neoforged.fml.loading.moddiscovery.ExplodedDirectoryLocator; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.neoforgespi.language.IModLanguageProvider; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.artifact.versioning.VersionRange; +import org.slf4j.Logger; -public class LanguageLoadingProvider -{ +public class LanguageLoadingProvider { private static final Logger LOGGER = LogUtils.getLogger(); private final List languageProviders = new ArrayList<>(); private final ServiceLoader serviceLoader; private final Map languageProviderMap = new HashMap<>(); private List languagePaths = new ArrayList<>(); - public void forEach(final Consumer consumer) - { + public void forEach(final Consumer consumer) { languageProviders.forEach(consumer); } @@ -53,31 +50,29 @@ private static class ModLanguageWrapper { private final IModLanguageProvider modLanguageProvider; private final ArtifactVersion version; - public ModLanguageWrapper(IModLanguageProvider modLanguageProvider, ArtifactVersion version) - { + + public ModLanguageWrapper(IModLanguageProvider modLanguageProvider, ArtifactVersion version) { this.modLanguageProvider = modLanguageProvider; this.version = version; } - public ArtifactVersion getVersion() - { + + public ArtifactVersion getVersion() { return version; } - public IModLanguageProvider getModLanguageProvider() - { + public IModLanguageProvider getModLanguageProvider() { return modLanguageProvider; } - - } LanguageLoadingProvider() { - var sl = Launcher.INSTANCE.environment().findModuleLayerManager().flatMap(lm->lm.getLayer(IModuleLayerManager.Layer.PLUGIN)).orElseThrow(); + var sl = Launcher.INSTANCE.environment().findModuleLayerManager().flatMap(lm -> lm.getLayer(IModuleLayerManager.Layer.PLUGIN)).orElseThrow(); serviceLoader = ServiceLoader.load(sl, IModLanguageProvider.class); loadLanguageProviders(); } + private void loadLanguageProviders() { - LOGGER.debug(LogMarkers.CORE, "Found {} language providers", ServiceLoaderUtils.streamServiceLoader(()->serviceLoader, sce->LOGGER.error("Problem with language loaders")).count()); + LOGGER.debug(LogMarkers.CORE, "Found {} language providers", ServiceLoaderUtils.streamServiceLoader(() -> serviceLoader, sce -> LOGGER.error("Problem with language loaders")).count()); serviceLoader.forEach(languageProviders::add); ImmediateWindowHandler.updateProgress("Loading language providers"); languageProviders.forEach(lp -> { @@ -91,17 +86,17 @@ private void loadLanguageProviders() { String impl = implementationVersion.orElse(Files.isDirectory(lpPath) ? FMLLoader.versionInfo().fmlVersion().split("\\.")[0] : null); if (impl == null) { LOGGER.error(LogMarkers.CORE, "Found unversioned language provider {}", lp.name()); - throw new RuntimeException("Failed to find implementation version for language provider "+ lp.name()); + throw new RuntimeException("Failed to find implementation version for language provider " + lp.name()); } LOGGER.debug(LogMarkers.CORE, "Found language provider {}, version {}", lp.name(), impl); - ImmediateWindowHandler.updateProgress("Loaded language provider "+lp.name()+ " " + impl); + ImmediateWindowHandler.updateProgress("Loaded language provider " + lp.name() + " " + impl); languageProviderMap.put(lp.name(), new ModLanguageWrapper(lp, new DefaultArtifactVersion(impl))); }); } void addForgeLanguage(final Path forgePath) { if (!languageProviderMap.containsKey("javafml")) { - LOGGER.debug(LogMarkers.CORE,"Adding forge as a language from {}", forgePath.toString()); + LOGGER.debug(LogMarkers.CORE, "Adding forge as a language from {}", forgePath.toString()); addLanguagePaths(Stream.of(forgePath)); serviceLoader.reload(); loadLanguageProviders(); @@ -116,9 +111,8 @@ private void addLanguagePaths(final Stream langPaths) { // langPaths.peek(languagePaths::add).map(Path::toFile).map(File::toURI).map(rethrowFunction(URI::toURL)).forEach(languageClassLoader::addURL); } - public void addAdditionalLanguages(List modFiles) - { - if (modFiles==null) return; + public void addAdditionalLanguages(List modFiles) { + if (modFiles == null) return; Stream langPaths = modFiles.stream().map(ModFile::getFilePath); addLanguagePaths(langPaths); serviceLoader.reload(); @@ -133,12 +127,12 @@ public IModLanguageProvider findLanguage(ModFile mf, String modLoader, VersionRa final String languageFileName = mf.getProvider() instanceof ExplodedDirectoryLocator ? "in-development" : mf.getFileName(); final ModLanguageWrapper mlw = languageProviderMap.get(modLoader); if (mlw == null) { - LOGGER.error(LogMarkers.LOADING,"Missing language {} version {} wanted by {}", modLoader, modLoaderVersion, languageFileName); - throw new EarlyLoadingException("Missing language "+modLoader, null, Collections.singletonList(new EarlyLoadingException.ExceptionData("fml.language.missingversion", modLoader, modLoaderVersion, languageFileName, "null"))); + LOGGER.error(LogMarkers.LOADING, "Missing language {} version {} wanted by {}", modLoader, modLoaderVersion, languageFileName); + throw new EarlyLoadingException("Missing language " + modLoader, null, Collections.singletonList(new EarlyLoadingException.ExceptionData("fml.language.missingversion", modLoader, modLoaderVersion, languageFileName, "null"))); } if (!VersionSupportMatrix.testVersionSupportMatrix(modLoaderVersion, modLoader, "languageloader", (llid, range) -> range.containsVersion(mlw.getVersion()))) { - LOGGER.error(LogMarkers.LOADING,"Missing language {} version {} wanted by {}, found {}", modLoader, modLoaderVersion, languageFileName, mlw.getVersion()); - throw new EarlyLoadingException("Missing language "+ modLoader + " matching range "+modLoaderVersion + " found "+mlw.getVersion(), null, Collections.singletonList(new EarlyLoadingException.ExceptionData("fml.language.missingversion", modLoader, modLoaderVersion, languageFileName, mlw.getVersion()))); + LOGGER.error(LogMarkers.LOADING, "Missing language {} version {} wanted by {}, found {}", modLoader, modLoaderVersion, languageFileName, mlw.getVersion()); + throw new EarlyLoadingException("Missing language " + modLoader + " matching range " + modLoaderVersion + " found " + mlw.getVersion(), null, Collections.singletonList(new EarlyLoadingException.ExceptionData("fml.language.missingversion", modLoader, modLoaderVersion, languageFileName, mlw.getVersion()))); } return mlw.getModLanguageProvider(); diff --git a/loader/src/main/java/net/neoforged/fml/loading/LauncherVersion.java b/loader/src/main/java/net/neoforged/fml/loading/LauncherVersion.java index c7f0199ea..8a8aaa9aa 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LauncherVersion.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LauncherVersion.java @@ -5,11 +5,11 @@ package net.neoforged.fml.loading; +import static net.neoforged.fml.loading.LogMarkers.CORE; + import com.mojang.logging.LogUtils; import org.slf4j.Logger; -import static net.neoforged.fml.loading.LogMarkers.CORE; - public class LauncherVersion { private static final Logger LOGGER = LogUtils.getLogger(); private static final String launcherVersion; @@ -21,8 +21,7 @@ public class LauncherVersion { LOGGER.debug(CORE, "Found FMLLauncher version {}", launcherVersion); } - public static String getVersion() - { + public static String getVersion() { return launcherVersion; } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/LibraryFinder.java b/loader/src/main/java/net/neoforged/fml/loading/LibraryFinder.java index ca2303ddc..2bf895a43 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LibraryFinder.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LibraryFinder.java @@ -6,17 +6,17 @@ package net.neoforged.fml.loading; import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - import java.nio.file.Files; import java.nio.file.Path; +import org.slf4j.Logger; public class LibraryFinder { private static final Logger LOGGER = LogUtils.getLogger(); private static Path libsPath; + static Path findLibsPath() { if (libsPath == null) { - libsPath = Path.of(System.getProperty("libraryDirectory","crazysnowmannonsense/cheezwhizz")); + libsPath = Path.of(System.getProperty("libraryDirectory", "crazysnowmannonsense/cheezwhizz")); if (!Files.isDirectory(libsPath)) { throw new IllegalStateException("Missing libraryDirectory system property, cannot continue"); } @@ -25,7 +25,7 @@ static Path findLibsPath() { } static Path getForgeLibraryPath(final String mcVersion, final String forgeVersion, final String forgeGroup) { - Path forgePath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", "universal", mcVersion+"-"+forgeVersion)); + Path forgePath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", "universal", mcVersion + "-" + forgeVersion)); LOGGER.debug(LogMarkers.CORE, "Found forge path {} is {}", forgePath, pathStatus(forgePath)); return forgePath; } @@ -35,18 +35,19 @@ static String pathStatus(final Path path) { } static Path[] getMCPaths(final String mcVersion, final String mcpVersion, final String forgeVersion, final String forgeGroup, final String type) { - Path srgMcPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "srg", mcVersion+"-"+mcpVersion)); - Path mcExtrasPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "extra", mcVersion+"-"+mcpVersion)); - Path patchedBinariesPath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", type, mcVersion+"-"+forgeVersion)); - LOGGER.debug(LogMarkers.CORE,"SRG MC at {} is {}", srgMcPath.toString(), pathStatus(srgMcPath)); - LOGGER.debug(LogMarkers.CORE,"MC Extras at {} is {}", mcExtrasPath.toString(), pathStatus(mcExtrasPath)); - LOGGER.debug(LogMarkers.CORE,"Forge patches at {} is {}", patchedBinariesPath.toString(), pathStatus(patchedBinariesPath)); + Path srgMcPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "srg", mcVersion + "-" + mcpVersion)); + Path mcExtrasPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "extra", mcVersion + "-" + mcpVersion)); + Path patchedBinariesPath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", type, mcVersion + "-" + forgeVersion)); + LOGGER.debug(LogMarkers.CORE, "SRG MC at {} is {}", srgMcPath.toString(), pathStatus(srgMcPath)); + LOGGER.debug(LogMarkers.CORE, "MC Extras at {} is {}", mcExtrasPath.toString(), pathStatus(mcExtrasPath)); + LOGGER.debug(LogMarkers.CORE, "Forge patches at {} is {}", patchedBinariesPath.toString(), pathStatus(patchedBinariesPath)); return new Path[] { patchedBinariesPath, mcExtrasPath, srgMcPath }; } public static Path findPathForMaven(final String group, final String artifact, final String extension, final String classifier, final String version) { return findLibsPath().resolve(MavenCoordinateResolver.get(group, artifact, extension, classifier, version)); } + public static Path findPathForMaven(final String maven) { return findLibsPath().resolve(MavenCoordinateResolver.get(maven)); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java index b118d717c..7da76d8e5 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java @@ -6,13 +6,6 @@ package net.neoforged.fml.loading; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import net.neoforged.fml.loading.mixin.DeferredMixinConfigRegistration; -import net.neoforged.fml.loading.moddiscovery.BackgroundScanHandler; -import net.neoforged.fml.loading.moddiscovery.ModFile; -import net.neoforged.fml.loading.moddiscovery.ModFileInfo; -import net.neoforged.fml.loading.moddiscovery.ModInfo; -import net.neoforged.neoforgespi.locating.IModFile; - import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; @@ -24,13 +17,18 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.stream.Collectors; +import net.neoforged.fml.loading.mixin.DeferredMixinConfigRegistration; +import net.neoforged.fml.loading.moddiscovery.BackgroundScanHandler; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.fml.loading.moddiscovery.ModFileInfo; +import net.neoforged.fml.loading.moddiscovery.ModInfo; +import net.neoforged.neoforgespi.locating.IModFile; /** * Master list of all mods in the loading context. This class cannot refer outside the * loading package */ -public class LoadingModList -{ +public class LoadingModList { private static LoadingModList INSTANCE; private final List modFiles; private final List sortedList; @@ -39,8 +37,7 @@ public class LoadingModList private final List preLoadWarnings; private List brokenFiles; - private LoadingModList(final List modFiles, final List sortedList) - { + private LoadingModList(final List modFiles, final List sortedList) { this.modFiles = modFiles.stream() .map(ModFile::getModFileInfo) .map(ModFileInfo.class::cast) @@ -57,11 +54,9 @@ private LoadingModList(final List modFiles, final List sortedL this.preLoadWarnings = new ArrayList<>(); } - public static LoadingModList of(List modFiles, List sortedList, final EarlyLoadingException earlyLoadingException) - { + public static LoadingModList of(List modFiles, List sortedList, final EarlyLoadingException earlyLoadingException) { INSTANCE = new LoadingModList(modFiles, sortedList); - if (earlyLoadingException != null) - { + if (earlyLoadingException != null) { INSTANCE.preLoadErrors.add(earlyLoadingException); } return INSTANCE; @@ -70,8 +65,8 @@ public static LoadingModList of(List modFiles, List sortedList public static LoadingModList get() { return INSTANCE; } - public void addCoreMods() - { + + public void addCoreMods() { modFiles.stream() .map(ModFileInfo::getFile) .map(ModFile::getCoreMods) @@ -88,28 +83,24 @@ public void addMixinConfigs() { }); } - public void addAccessTransformers() - { + public void addAccessTransformers() { modFiles.stream() .map(ModFileInfo::getFile) .forEach(mod -> mod.getAccessTransformers().forEach(path -> FMLLoader.addAccessTransformer(path, mod))); } - public void addForScanning(BackgroundScanHandler backgroundScanHandler) - { + public void addForScanning(BackgroundScanHandler backgroundScanHandler) { backgroundScanHandler.setLoadingModList(this); modFiles.stream() .map(ModFileInfo::getFile) .forEach(backgroundScanHandler::submitForScanning); } - public List getModFiles() - { + public List getModFiles() { return modFiles; } - public Path findResource(final String className) - { + public Path findResource(final String className) { for (ModFileInfo mf : modFiles) { final Path resource = mf.getFile().findResource(className); if (Files.exists(resource)) return resource; @@ -128,9 +119,10 @@ public Enumeration findAllURLsForResource(final String resName) { return new Enumeration() { private final Iterator modFileIterator = modFiles.iterator(); private URL next; + @Override public boolean hasMoreElements() { - if (next!=null) return true; + if (next != null) return true; next = findNextURL(); return next != null; } @@ -151,7 +143,7 @@ private URL findNextURL() { final ModFileInfo next = modFileIterator.next(); final Path resource = next.getFile().findResource(resourceName); if (Files.exists(resource)) { - return LambdaExceptionUtils.uncheck(()->new URL("modjar://" + next.getMods().get(0).getModId() + "/" + resourceName)); + return LambdaExceptionUtils.uncheck(() -> new URL("modjar://" + next.getMods().get(0).getModId() + "/" + resourceName)); } } return null; @@ -159,13 +151,11 @@ private URL findNextURL() { }; } - public ModFileInfo getModFileById(String modid) - { + public ModFileInfo getModFileById(String modid) { return this.fileById.get(modid); } - public List getMods() - { + public List getMods() { return this.sortedList; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/MavenCoordinateResolver.java b/loader/src/main/java/net/neoforged/fml/loading/MavenCoordinateResolver.java index 609687a99..f5ab00059 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/MavenCoordinateResolver.java +++ b/loader/src/main/java/net/neoforged/fml/loading/MavenCoordinateResolver.java @@ -21,16 +21,15 @@ public static Path get(final String coordinate) { final String groupId = parts[0]; final String artifactId = parts[1]; final String classifier = parts.length > 3 ? parts[2] : ""; - final String[] versext = parts[parts.length-1].split("@"); + final String[] versext = parts[parts.length - 1].split("@"); final String version = versext[0]; final String extension = versext.length > 1 ? versext[1] : ""; return get(groupId, artifactId, extension, classifier, version); } - public static Path get(final String groupId, final String artifactId, final String extension, final String classifier, final String version) - { + public static Path get(final String groupId, final String artifactId, final String extension, final String classifier, final String version) { final String fileName = artifactId + "-" + version + - (!classifier.isEmpty() ? "-"+ classifier : "") + + (!classifier.isEmpty() ? "-" + classifier : "") + (!extension.isEmpty() ? "." + extension : ".jar"); String[] groups = groupId.split("\\."); diff --git a/loader/src/main/java/net/neoforged/fml/loading/MixinSyntheticPackageProvider.java b/loader/src/main/java/net/neoforged/fml/loading/MixinSyntheticPackageProvider.java index b17f100df..87569a589 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/MixinSyntheticPackageProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/MixinSyntheticPackageProvider.java @@ -11,28 +11,22 @@ import cpw.mods.modlauncher.api.ITransformationService; import cpw.mods.modlauncher.api.ITransformer; import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.asm.util.Constants; - import java.nio.file.Path; import java.util.List; import java.util.Set; +import org.spongepowered.asm.util.Constants; public class MixinSyntheticPackageProvider implements ITransformationService { @Override - public @NotNull String name() { + public String name() { return "mixin-synthetic-package"; } @Override - public void initialize(IEnvironment environment) { - - } + public void initialize(IEnvironment environment) {} @Override - public void onLoad(IEnvironment env, Set otherServices) throws IncompatibleEnvironmentException { - - } + public void onLoad(IEnvironment env, Set otherServices) throws IncompatibleEnvironmentException {} @Override public List beginScanning(IEnvironment environment) { @@ -40,16 +34,14 @@ public List beginScanning(IEnvironment environment) { return List.of( new Resource(IModuleLayerManager.Layer.GAME, List.of( new VirtualJar("mixinsynthetic", Path.of(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), - Constants.SYNTHETIC_PACKAGE, Constants.SYNTHETIC_PACKAGE + ".args") - )) - ); + Constants.SYNTHETIC_PACKAGE, Constants.SYNTHETIC_PACKAGE + ".args")))); } catch (Exception exception) { throw new RuntimeException("Failed to intialise synthetic Mixin virtual jar", exception); } } @Override - public @NotNull List> transformers() { + public List> transformers() { return List.of(); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/ModDirTransformerDiscoverer.java b/loader/src/main/java/net/neoforged/fml/loading/ModDirTransformerDiscoverer.java index 791824127..43cdf7c78 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ModDirTransformerDiscoverer.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ModDirTransformerDiscoverer.java @@ -9,8 +9,6 @@ import cpw.mods.modlauncher.api.LambdaExceptionUtils; import cpw.mods.modlauncher.api.NamedPath; import cpw.mods.modlauncher.serviceapi.ITransformerDiscoveryService; -import org.slf4j.Logger; - import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.AccessDeniedException; @@ -19,6 +17,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; public class ModDirTransformerDiscoverer implements ITransformerDiscoveryService { private static final Logger LOGGER = LogUtils.getLogger(); @@ -41,14 +40,14 @@ public List candidates(final Path gameDirectory, final String launchT @Override public void earlyInitialization(final String launchTarget, final String[] arguments) { ImmediateWindowHandler.load(launchTarget, arguments); - if (this.alreadyFailed!=null) { + if (this.alreadyFailed != null) { String errorCause; if (this.alreadyFailed.getCause() instanceof FileAlreadyExistsException faee) { errorCause = "File already exists: " + faee.getFile() + "\nYou need to move this out of the way, so we can put a directory there."; } else if (this.alreadyFailed.getCause() instanceof AccessDeniedException ade) { - errorCause = "Access denied trying to create a file or directory "+ade.getMessage() +"\nThe game directory is probably read-only. Check the write permission on it."; + errorCause = "Access denied trying to create a file or directory " + ade.getMessage() + "\nThe game directory is probably read-only. Check the write permission on it."; } else { - errorCause = "An unexpected IO error occurred trying to setup the game directory\n"+this.alreadyFailed.getCause().getMessage(); + errorCause = "An unexpected IO error occurred trying to setup the game directory\n" + this.alreadyFailed.getCause().getMessage(); } ImmediateWindowHandler.crash(errorCause); throw this.alreadyFailed; @@ -64,7 +63,7 @@ public List candidates(final Path gameDirectory) { private final static List found = new ArrayList<>(); public static List allExcluded() { - return found.stream().map(np->np.paths()[0]).toList(); + return found.stream().map(np -> np.paths()[0]).toList(); } private static void scan(final Path gameDirectory) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/ModJarURLHandler.java b/loader/src/main/java/net/neoforged/fml/loading/ModJarURLHandler.java index 114e87691..1526d71af 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ModJarURLHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ModJarURLHandler.java @@ -7,8 +7,6 @@ import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import org.slf4j.Logger; - import java.io.IOException; import java.io.InputStream; import java.net.URL; @@ -19,10 +17,11 @@ import java.util.Objects; import java.util.Optional; import java.util.jar.Manifest; +import org.slf4j.Logger; -public class ModJarURLHandler extends URLStreamHandler -{ +public class ModJarURLHandler extends URLStreamHandler { private static final Logger LOGGER = LogUtils.getLogger(); + // modjar://modid/path/to/file @Override protected URLConnection openConnection(URL url) { @@ -52,8 +51,7 @@ public ModJarURLConnection(final URL url) { } @Override - public void connect() - { + public void connect() { // if (resource == null) { // modid = url.getHost(); // // trim first char @@ -64,8 +62,7 @@ public void connect() } @Override - public InputStream getInputStream() throws IOException - { + public InputStream getInputStream() throws IOException { connect(); LOGGER.trace(LogMarkers.CORE, "Loading modjar URL {} got resource {} {}", url, resource, resource != null ? Files.exists(resource) : "missing"); return Files.newInputStream(resource); @@ -84,7 +81,7 @@ public long getContentLengthLong() { // Used to cache protectiondomains by "top level object" aka the modid @Override public URL getURL() { - return LambdaExceptionUtils.uncheck(()->new URL("modjar://"+modid)); + return LambdaExceptionUtils.uncheck(() -> new URL("modjar://" + modid)); } public Optional getManifest() { diff --git a/loader/src/main/java/net/neoforged/fml/loading/ModSorter.java b/loader/src/main/java/net/neoforged/fml/loading/ModSorter.java index 2c789b58d..0771fdb73 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/ModSorter.java +++ b/loader/src/main/java/net/neoforged/fml/loading/ModSorter.java @@ -5,32 +5,42 @@ package net.neoforged.fml.loading; +import static java.util.stream.Collectors.flatMapping; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; +import static java.util.stream.Collectors.toSet; + import com.google.common.graph.GraphBuilder; import com.google.common.graph.MutableGraph; import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.SecureJar; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.jar.Manifest; +import java.util.stream.Collectors; +import java.util.stream.Stream; import net.neoforged.fml.loading.moddiscovery.MinecraftLocator; -import net.neoforged.neoforgespi.language.IModInfo; import net.neoforged.fml.loading.moddiscovery.ModFile; import net.neoforged.fml.loading.moddiscovery.ModFileInfo; import net.neoforged.fml.loading.moddiscovery.ModInfo; import net.neoforged.fml.loading.toposort.CyclePresentException; import net.neoforged.fml.loading.toposort.TopologicalSort; +import net.neoforged.neoforgespi.language.IModInfo; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.slf4j.Logger; -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; -import java.util.jar.Manifest; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.*; - -public class ModSorter -{ +public class ModSorter { private static final Logger LOGGER = LogUtils.getLogger(); private final UniqueModListBuilder uniqueModListBuilder; private List modFiles; @@ -38,19 +48,17 @@ public class ModSorter private Map modIdNameLookup; private List systemMods; - private ModSorter(final List modFiles) - { + private ModSorter(final List modFiles) { this.uniqueModListBuilder = new UniqueModListBuilder(modFiles); } - public static LoadingModList sort(List mods, final List errors) - { + public static LoadingModList sort(List mods, final List errors) { final ModSorter ms = new ModSorter(mods); try { ms.buildUniqueList(); } catch (EarlyLoadingException e) { // We cannot build any list with duped mods. We have to abort immediately and report it - return LoadingModList.of(ms.systemMods, ms.systemMods.stream().map(mf->(ModInfo)mf.getModInfos().get(0)).collect(toList()), e); + return LoadingModList.of(ms.systemMods, ms.systemMods.stream().map(mf -> (ModInfo) mf.getModInfos().get(0)).collect(toList()), e); } // try and validate dependencies @@ -60,7 +68,7 @@ public static LoadingModList sort(List mods, final List(ModInfo)mf.getModInfos().get(0)).collect(toList()), new EarlyLoadingException("failure to validate mod list", null, resolutionResult.buildErrorMessages())); + list = LoadingModList.of(ms.systemMods, ms.systemMods.stream().map(mf -> (ModInfo) mf.getModInfos().get(0)).collect(toList()), new EarlyLoadingException("failure to validate mod list", null, resolutionResult.buildErrorMessages())); } else { // Otherwise, lets try and sort the modlist and proceed EarlyLoadingException earlyLoadingException = null; @@ -77,15 +85,13 @@ public static LoadingModList sort(List mods, final List graph = GraphBuilder.directed().build(); AtomicInteger counter = new AtomicInteger(); @@ -98,25 +104,20 @@ private void sort() modFiles.stream() .map(ModFile::getModInfos) .mapMulti(Iterable::forEach) - .map(IModInfo::getDependencies) - .mapMulti(Iterable::forEach) + .map(IModInfo::getDependencies).mapMulti(Iterable::forEach) .forEach(dep -> addDependency(graph, dep)); final List sorted; - try - { + try { sorted = TopologicalSort.topologicalSort(graph, Comparator.comparing(infos::get)); - } - catch (CyclePresentException e) - { + } catch (CyclePresentException e) { Set> cycles = e.getCycles(); - if (LOGGER.isErrorEnabled(LogMarkers.LOADING)) - { + if (LOGGER.isErrorEnabled(LogMarkers.LOADING)) { LOGGER.error(LogMarkers.LOADING, "Mod Sorting failed.\nDetected Cycles: {}\n", cycles); } var dataList = cycles.stream() .mapMulti(Iterable::forEach) - .mapMulti((mf,c)->mf.getMods().forEach(c)) + .mapMulti((mf, c) -> mf.getMods().forEach(c)) .map(IModInfo::getModId) .map(list -> new EarlyLoadingException.ExceptionData("fml.modloading.cycle", list)) .toList(); @@ -133,9 +134,8 @@ private void sort() } @SuppressWarnings("UnstableApiUsage") - private void addDependency(MutableGraph topoGraph, IModInfo.ModVersion dep) - { - final ModFileInfo self = (ModFileInfo)dep.getOwner().getOwningFile(); + private void addDependency(MutableGraph topoGraph, IModInfo.ModVersion dep) { + final ModFileInfo self = (ModFileInfo) dep.getOwner().getOwningFile(); final IModInfo targetModInfo = modIdNameLookup.get(dep.getModId()); // soft dep that doesn't exist. Just return. No edge required. if (targetModInfo == null || !(targetModInfo.getOwningFile() instanceof final ModFileInfo target)) return; @@ -147,8 +147,7 @@ private void addDependency(MutableGraph topoGraph, IModInfo.ModVers } } - private void buildUniqueList() - { + private void buildUniqueList() { final UniqueModListBuilder.UniqueModListData uniqueModListData = uniqueModListBuilder.buildUniqueList(); this.modFiles = uniqueModListData.modFiles(); @@ -158,13 +157,11 @@ private void buildUniqueList() modIdNameLookup = uniqueModListData.modFilesByFirstId().entrySet().stream() .filter(e -> !e.getValue().get(0).getModInfos().isEmpty()) .collect(Collectors.toMap( - Map.Entry::getKey, - e -> e.getValue().get(0).getModInfos().get(0) - )); + Map.Entry::getKey, + e -> e.getValue().get(0).getModInfos().get(0))); } - private void detectSystemMods(final Map> modFilesByFirstId) - { + private void detectSystemMods(final Map> modFilesByFirstId) { // Capture system mods (ex. MC, Forge) here, so we can keep them for later final Set systemMods = new HashSet<>(); // The minecraft mod is always a system mod @@ -198,35 +195,32 @@ public record DependencyResolutionResult( Collection incompatibilities, Collection discouraged, Collection versionResolution, - Map modVersions - ) { + Map modVersions) { public List buildWarningMessages() { return Stream.concat(discouraged.stream() .map(mv -> new EarlyLoadingException.ExceptionData("fml.modloading.discouragedmod", mv.getOwner(), mv.getModId(), mv.getOwner().getModId(), mv.getVersionRange(), modVersions.get(mv.getModId()), mv.getReason().orElse("fml.modloading.discouragedmod.noreason"))), - Stream.of(new EarlyLoadingException.ExceptionData("fml.modloading.discouragedmod.proceed"))) + Stream.of(new EarlyLoadingException.ExceptionData("fml.modloading.discouragedmod.proceed"))) .toList(); } public List buildErrorMessages() { return Stream.concat( - versionResolution.stream() - .map(mv -> new EarlyLoadingException.ExceptionData(mv.getType() == IModInfo.DependencyType.REQUIRED ? "fml.modloading.missingdependency" : "fml.modloading.missingdependency.optional", - mv.getOwner(), mv.getModId(), mv.getOwner().getModId(), mv.getVersionRange(), - modVersions.getOrDefault(mv.getModId(), new DefaultArtifactVersion("null")), mv.getReason())), - incompatibilities.stream() - .map(mv -> new EarlyLoadingException.ExceptionData("fml.modloading.incompatiblemod", - mv.getOwner(), mv.getModId(), mv.getOwner().getModId(), mv.getVersionRange(), - modVersions.get(mv.getModId()), mv.getReason().orElse("fml.modloading.incompatiblemod.noreason"))) - ) + versionResolution.stream() + .map(mv -> new EarlyLoadingException.ExceptionData(mv.getType() == IModInfo.DependencyType.REQUIRED ? "fml.modloading.missingdependency" : "fml.modloading.missingdependency.optional", + mv.getOwner(), mv.getModId(), mv.getOwner().getModId(), mv.getVersionRange(), + modVersions.getOrDefault(mv.getModId(), new DefaultArtifactVersion("null")), mv.getReason())), + incompatibilities.stream() + .map(mv -> new EarlyLoadingException.ExceptionData("fml.modloading.incompatiblemod", + mv.getOwner(), mv.getModId(), mv.getOwner().getModId(), mv.getVersionRange(), + modVersions.get(mv.getModId()), mv.getReason().orElse("fml.modloading.incompatiblemod.noreason")))) .toList(); } } - private DependencyResolutionResult verifyDependencyVersions() - { + private DependencyResolutionResult verifyDependencyVersions() { final var modVersions = modFiles.stream() .map(ModFile::getModInfos) .mapMulti(Iterable::forEach) @@ -237,8 +231,7 @@ private DependencyResolutionResult verifyDependencyVersions() .mapMulti(Iterable::forEach) .collect(groupingBy(Function.identity(), flatMapping(e -> e.getDependencies().stream(), toList()))); - final var modRequirements = modVersionDependencies.values().stream() - .mapMulti(Iterable::forEach) + final var modRequirements = modVersionDependencies.values().stream().mapMulti(Iterable::forEach) .filter(mv -> mv.getSide().isCorrectSide()) .collect(toSet()); @@ -264,8 +257,7 @@ private DependencyResolutionResult verifyDependencyVersions() "Conflicts between mods:\n{}\n\tIssues may arise. Continue at your own risk.", discouragedVersions.stream() .map(ver -> formatIncompatibleDependencyError(ver, "discourages", modVersions)) - .collect(Collectors.joining("\n")) - ); + .collect(Collectors.joining("\n"))); } if (mandatoryMissing > 0) { @@ -275,8 +267,7 @@ private DependencyResolutionResult verifyDependencyVersions() missingVersions.stream() .filter(mv -> mv.getType() == IModInfo.DependencyType.REQUIRED) .map(ver -> formatDependencyError(ver, modVersions)) - .collect(Collectors.joining("\n")) - ); + .collect(Collectors.joining("\n"))); } if (missingVersions.size() - mandatoryMissing > 0) { LOGGER.error( @@ -285,8 +276,7 @@ private DependencyResolutionResult verifyDependencyVersions() missingVersions.stream() .filter(ver -> ver.getType() == IModInfo.DependencyType.OPTIONAL) .map(ver -> formatDependencyError(ver, modVersions)) - .collect(Collectors.joining("\n")) - ); + .collect(Collectors.joining("\n"))); } if (!incompatibleVersions.isEmpty()) { @@ -295,39 +285,33 @@ private DependencyResolutionResult verifyDependencyVersions() "Incompatibilities between mods:\n{}", incompatibleVersions.stream() .map(ver -> formatIncompatibleDependencyError(ver, "is incompatible with", modVersions)) - .collect(Collectors.joining("\n")) - ); + .collect(Collectors.joining("\n"))); } return new DependencyResolutionResult(incompatibleVersions, discouragedVersions, missingVersions, modVersions); } - private static String formatDependencyError(IModInfo.ModVersion dependency, Map modVersions) - { + private static String formatDependencyError(IModInfo.ModVersion dependency, Map modVersions) { ArtifactVersion installed = modVersions.get(dependency.getModId()); return String.format( "\tMod ID: '%s', Requested by: '%s', Expected range: '%s', Actual version: '%s'", dependency.getModId(), dependency.getOwner().getModId(), dependency.getVersionRange(), - installed != null ? installed.toString() : "[MISSING]" - ); + installed != null ? installed.toString() : "[MISSING]"); } - private static String formatIncompatibleDependencyError(IModInfo.ModVersion dependency, String type, Map modVersions) - { + private static String formatIncompatibleDependencyError(IModInfo.ModVersion dependency, String type, Map modVersions) { return String.format( "\tMod '%s' %s '%s', versions: '%s'; Version found: '%s'", dependency.getOwner().getModId(), type, dependency.getModId(), dependency.getVersionRange(), - modVersions.get(dependency.getModId()).toString() - ); + modVersions.get(dependency.getModId()).toString()); } - private boolean modVersionNotContained(final IModInfo.ModVersion mv, final Map modVersions) - { + private boolean modVersionNotContained(final IModInfo.ModVersion mv, final Map modVersions) { return !(VersionSupportMatrix.testVersionSupportMatrix(mv.getVersionRange(), mv.getModId(), "mod", (modId, range) -> modVersions.containsKey(modId) && (range.containsVersion(modVersions.get(modId)) || modVersions.get(modId).toString().equals("0.0NONE")))); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/StringSubstitutor.java b/loader/src/main/java/net/neoforged/fml/loading/StringSubstitutor.java index 5ce44c75a..1e63a6f89 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/StringSubstitutor.java +++ b/loader/src/main/java/net/neoforged/fml/loading/StringSubstitutor.java @@ -6,39 +6,31 @@ package net.neoforged.fml.loading; import com.google.common.collect.ImmutableMap; +import java.util.Map; import net.neoforged.fml.loading.moddiscovery.ModFile; import org.apache.commons.lang3.text.StrLookup; import org.apache.commons.lang3.text.StrSubstitutor; -import java.util.Map; - @SuppressWarnings("deprecation") -public class StringSubstitutor -{ - private static final Map globals = ImmutableMap.of( +public class StringSubstitutor { + private static final Map globals = ImmutableMap.of( "mcVersion", FMLLoader.versionInfo().mcVersion(), - "neoForgeVersion", FMLLoader.versionInfo().neoForgeVersion() - ); + "neoForgeVersion", FMLLoader.versionInfo().neoForgeVersion()); public static String replace(final String in, final ModFile file) { return new StrSubstitutor(getStringLookup(file)).replace(in); } private static StrLookup getStringLookup(final ModFile file) { - return new StrLookup() - { + return new StrLookup() { @Override - public String lookup(String key) - { + public String lookup(String key) { final String[] parts = key.split("\\."); if (parts.length == 1) return key; final String pfx = parts[0]; - if ("global".equals(pfx)) - { + if ("global".equals(pfx)) { return globals.get(parts[1]); - } - else if ("file".equals(pfx) && file != null) - { + } else if ("file".equals(pfx) && file != null) { return String.valueOf(file.getSubstitutionMap().get().get(parts[1])); } return key; diff --git a/loader/src/main/java/net/neoforged/fml/loading/StringUtils.java b/loader/src/main/java/net/neoforged/fml/loading/StringUtils.java index 4bd6e2c9b..b7e5fc941 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/StringUtils.java +++ b/loader/src/main/java/net/neoforged/fml/loading/StringUtils.java @@ -5,12 +5,11 @@ package net.neoforged.fml.loading; -import org.apache.commons.lang3.text.StrSubstitutor; - import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import java.util.Map; +import org.apache.commons.lang3.text.StrSubstitutor; public class StringUtils { public static String toLowerCase(final String str) { @@ -31,8 +30,8 @@ public static URL toURL(final String string) { return null; try { - return new URL(string); } - catch (MalformedURLException e) { + return new URL(string); + } catch (MalformedURLException e) { throw new RuntimeException(e); } } @@ -44,8 +43,8 @@ public static String parseStringFormat(final String input, final Map>4)); - sb.append(Integer.toHexString(bytes[i]&0x0f)); + sb.append(Integer.toHexString((bytes[i] & 0xf0) >> 4)); + sb.append(Integer.toHexString(bytes[i] & 0x0f)); } return sb.toString(); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/TracingPrintStream.java b/loader/src/main/java/net/neoforged/fml/loading/TracingPrintStream.java index afbc40890..fb0f73baa 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/TracingPrintStream.java +++ b/loader/src/main/java/net/neoforged/fml/loading/TracingPrintStream.java @@ -5,96 +5,79 @@ package net.neoforged.fml.loading; -import org.slf4j.Logger; import java.io.PrintStream; +import org.slf4j.Logger; /** * PrintStream which redirects it's output to a given logger. * */ -public class TracingPrintStream extends PrintStream -{ - +public class TracingPrintStream extends PrintStream { private static final int BASE_DEPTH = 4; private final Logger logger; - public TracingPrintStream(Logger logger, PrintStream original) - { + public TracingPrintStream(Logger logger, PrintStream original) { super(original); this.logger = logger; } - private void log(String s) - { + private void log(String s) { logger.info("{}{}", getPrefix(), s); } - private static String getPrefix() - { + private static String getPrefix() { StackTraceElement[] elems = Thread.currentThread().getStackTrace(); StackTraceElement elem = elems[Math.min(BASE_DEPTH, elems.length - 1)]; // The caller is always at BASE_DEPTH, including this call. - if (elem.getClassName().startsWith("kotlin.io.")) - { + if (elem.getClassName().startsWith("kotlin.io.")) { elem = elems[Math.min(BASE_DEPTH + 2, elems.length - 1)]; // Kotlins IoPackage masks origins 2 deeper in the stack. - } - else if (elem.getClassName().startsWith("java.lang.Throwable")) - { + } else if (elem.getClassName().startsWith("java.lang.Throwable")) { elem = elems[Math.min(BASE_DEPTH + 4, elems.length - 1)]; } return "[" + elem.getClassName() + ":" + elem.getMethodName() + ":" + elem.getLineNumber() + "]: "; } @Override - public void println(Object o) - { + public void println(Object o) { log(String.valueOf(o)); } @Override - public void println(String s) - { + public void println(String s) { log(s); } @Override - public void println(boolean x) - { + public void println(boolean x) { log(String.valueOf(x)); } @Override - public void println(char x) - { + public void println(char x) { log(String.valueOf(x)); } @Override - public void println(int x) - { + public void println(int x) { log(String.valueOf(x)); } @Override - public void println(long x) - { + public void println(long x) { log(String.valueOf(x)); } @Override - public void println(float x) - { + public void println(float x) { log(String.valueOf(x)); } @Override - public void println(double x) - { + public void println(double x) { log(String.valueOf(x)); } @Override - public void println(char[] x) - { + public void println(char[] x) { log(String.valueOf(x)); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/TransformerDiscovererConstants.java b/loader/src/main/java/net/neoforged/fml/loading/TransformerDiscovererConstants.java index c328b22d6..af1ec5e8c 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/TransformerDiscovererConstants.java +++ b/loader/src/main/java/net/neoforged/fml/loading/TransformerDiscovererConstants.java @@ -10,7 +10,6 @@ import cpw.mods.jarhandling.SecureJar; import cpw.mods.modlauncher.api.IModuleLayerManager.Layer; import cpw.mods.modlauncher.serviceapi.ITransformerDiscoveryService; - import java.nio.file.Path; import java.util.Set; @@ -19,20 +18,19 @@ * may use. */ public final class TransformerDiscovererConstants { - private TransformerDiscovererConstants() { } + private TransformerDiscovererConstants() {} /** * Defines the set of FML service types which should be loaded on the * {@link Layer#SERVICE} module layer. */ public static final Set SERVICES = Set.of( - "cpw.mods.modlauncher.api.ITransformationService", - "net.neoforged.neoforgespi.locating.IModLocator", - "net.neoforged.neoforgespi.locating.IDependencyLocator", - "net.neoforged.neoforgespi.earlywindow.GraphicsBootstrapper", - "net.neoforged.fml.loading.ImmediateWindowProvider", // FIXME: remove this when removing the legacy ImmediateWindowProvider - "net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider" - ); + "cpw.mods.modlauncher.api.ITransformationService", + "net.neoforged.neoforgespi.locating.IModLocator", + "net.neoforged.neoforgespi.locating.IDependencyLocator", + "net.neoforged.neoforgespi.earlywindow.GraphicsBootstrapper", + "net.neoforged.fml.loading.ImmediateWindowProvider", // FIXME: remove this when removing the legacy ImmediateWindowProvider + "net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider"); public static boolean shouldLoadInServiceLayer(Path... path) { JarMetadata metadata = JarMetadata.from(new JarContentsBuilder().paths(path).build()); diff --git a/loader/src/main/java/net/neoforged/fml/loading/UniqueModListBuilder.java b/loader/src/main/java/net/neoforged/fml/loading/UniqueModListBuilder.java index 816e28db8..b25357e06 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/UniqueModListBuilder.java +++ b/loader/src/main/java/net/neoforged/fml/loading/UniqueModListBuilder.java @@ -5,12 +5,11 @@ package net.neoforged.fml.loading; -import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.moddiscovery.ModFile; -import net.neoforged.neoforgespi.language.IModInfo; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.slf4j.Logger; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.joining; +import static net.neoforged.fml.loading.LogMarkers.LOADING; +import com.mojang.logging.LogUtils; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -18,21 +17,21 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.neoforgespi.language.IModInfo; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.slf4j.Logger; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.joining; -import static net.neoforged.fml.loading.LogMarkers.LOADING; - -public class UniqueModListBuilder -{ +public class UniqueModListBuilder { private final static Logger LOGGER = LogUtils.getLogger(); private final List modFiles; - public UniqueModListBuilder(final List modFiles) {this.modFiles = modFiles;} + public UniqueModListBuilder(final List modFiles) { + this.modFiles = modFiles; + } - public UniqueModListData buildUniqueList() - { + public UniqueModListData buildUniqueList() { List uniqueModList; List uniqueLibListWithVersion; @@ -66,9 +65,8 @@ public UniqueModListData buildUniqueList() final Map> versionedLibIds = uniqueLibListWithVersion.stream() .map(UniqueModListBuilder::getModId) .collect(Collectors.toMap( - Function.identity(), - libFilesWithVersionByModuleName::get - )); + Function.identity(), + libFilesWithVersionByModuleName::get)); // Its theoretically possible that some mod has somehow moved an id to a secondary place, thus causing a dupe. // We can't handle this @@ -77,8 +75,8 @@ public UniqueModListData buildUniqueList() .map(mods -> String.format("\tMod ID: '%s' from mod files: %s", mods.get(0).getModId(), mods.stream() - .map(modInfo -> modInfo.getOwningFile().getFile().getFileName()).collect(joining(", ")) - )).toList(); + .map(modInfo -> modInfo.getOwningFile().getFile().getFileName()).collect(joining(", ")))) + .toList(); if (!dupedModErrors.isEmpty()) { LOGGER.error(LOADING, "Found duplicate mods:\n{}", dupedModErrors.stream().collect(joining("\n"))); @@ -87,14 +85,13 @@ public UniqueModListData buildUniqueList() .toList()); } - final List dupedLibErrors = versionedLibIds.values().stream() .filter(modFiles -> modFiles.size() > 1) .map(mods -> String.format("\tLibrary: '%s' from files: %s", getModId(mods.get(0)), mods.stream() - .map(modFile -> modFile.getFileName()).collect(joining(", ")) - )).toList(); + .map(modFile -> modFile.getFileName()).collect(joining(", ")))) + .toList(); if (!dupedLibErrors.isEmpty()) { LOGGER.error(LOADING, "Found duplicate plugins or libraries:\n{}", dupedLibErrors.stream().collect(joining("\n"))); @@ -124,8 +121,7 @@ private ModFile selectNewestModInfo(Map.Entry> fullList) { return modInfoList.get(0); } - private ArtifactVersion getVersion(final ModFile mf) - { + private ArtifactVersion getVersion(final ModFile mf) { if (mf.getModFileInfo() == null || mf.getModInfos() == null || mf.getModInfos().isEmpty()) { return mf.getJarVersion(); } @@ -142,5 +138,4 @@ private static String getModId(ModFile modFile) { } public record UniqueModListData(List modFiles, Map> modFilesByFirstId) {} - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/VersionInfo.java b/loader/src/main/java/net/neoforged/fml/loading/VersionInfo.java index 127536017..98a917810 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/VersionInfo.java +++ b/loader/src/main/java/net/neoforged/fml/loading/VersionInfo.java @@ -13,7 +13,7 @@ public record VersionInfo(String neoForgeVersion, String fmlVersion, String mcVe } public String mcAndFmlVersion() { - return mcVersion+"-"+ fmlVersion; + return mcVersion + "-" + fmlVersion; } public String mcAndNeoFormVersion() { diff --git a/loader/src/main/java/net/neoforged/fml/loading/VersionSupportMatrix.java b/loader/src/main/java/net/neoforged/fml/loading/VersionSupportMatrix.java index 69b15a83e..7d2050f90 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/VersionSupportMatrix.java +++ b/loader/src/main/java/net/neoforged/fml/loading/VersionSupportMatrix.java @@ -5,33 +5,34 @@ package net.neoforged.fml.loading; -import net.neoforged.neoforgespi.language.MavenVersionAdapter; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.artifact.versioning.DefaultArtifactVersion; -import org.apache.maven.artifact.versioning.VersionRange; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.function.BiPredicate; +import net.neoforged.neoforgespi.language.MavenVersionAdapter; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.artifact.versioning.VersionRange; public class VersionSupportMatrix { private static final HashMap> overrideVersions = new HashMap<>(); static { final ArtifactVersion version = new DefaultArtifactVersion(FMLLoader.versionInfo().mcVersion()); - if (MavenVersionAdapter.createFromVersionSpec("[1.19.2]").containsVersion(version)) { - // 1.19.2 is Compatible with 1.19.1 - add("languageloader.javafml", "42"); - add("mod.minecraft", "1.19.1"); - add("mod.forge", "42.0.9"); + if (MavenVersionAdapter.createFromVersionSpec("[1.19.2]").containsVersion(version)) { + // 1.19.2 is Compatible with 1.19.1 + add("languageloader.javafml", "42"); + add("mod.minecraft", "1.19.1"); + add("mod.forge", "42.0.9"); } } + private static void add(String key, String value) { overrideVersions.computeIfAbsent(key, k -> new ArrayList<>()).add(new DefaultArtifactVersion(value)); } + public static boolean testVersionSupportMatrix(VersionRange declaredRange, String lookupId, String type, BiPredicate standardLookup) { if (standardLookup.test(lookupId, declaredRange)) return true; - List custom = overrideVersions.get(type +"." +lookupId); - return custom == null ? false : custom.stream().anyMatch(declaredRange::containsVersion); + List custom = overrideVersions.get(type + "." + lookupId); + return custom == null ? false : custom.stream().anyMatch(declaredRange::containsVersion); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/log4j/ForgeHighlight.java b/loader/src/main/java/net/neoforged/fml/loading/log4j/ForgeHighlight.java index bf6af2e70..7fde42ec2 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/log4j/ForgeHighlight.java +++ b/loader/src/main/java/net/neoforged/fml/loading/log4j/ForgeHighlight.java @@ -5,6 +5,10 @@ package net.neoforged.fml.loading.log4j; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import net.minecrell.terminalconsole.HighlightErrorConverter; import net.minecrell.terminalconsole.TerminalConsoleAppender; import org.apache.logging.log4j.Logger; @@ -17,11 +21,6 @@ import org.apache.logging.log4j.util.PerformanceSensitive; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - /** * A wrapper for {@link HighlightConverter} that auto-disables ANSI when the terminal doesn't support it. * Ansi support is determined by TerminalConsoleAppender @@ -36,7 +35,7 @@ public class ForgeHighlight { * Gets a new instance of the {@link HighlightErrorConverter} with the * specified options. * - * @param config The current configuration + * @param config The current configuration * @param options The pattern options * @return The new instance */ diff --git a/loader/src/main/java/net/neoforged/fml/loading/log4j/SLF4JFixerLaunchPluginService.java b/loader/src/main/java/net/neoforged/fml/loading/log4j/SLF4JFixerLaunchPluginService.java index dcc3e0ea5..067462bd6 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/log4j/SLF4JFixerLaunchPluginService.java +++ b/loader/src/main/java/net/neoforged/fml/loading/log4j/SLF4JFixerLaunchPluginService.java @@ -7,11 +7,10 @@ import cpw.mods.modlauncher.api.NamedPath; import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; +import java.util.EnumSet; import org.objectweb.asm.Type; import org.slf4j.LoggerFactory; -import java.util.EnumSet; - public class SLF4JFixerLaunchPluginService implements ILaunchPluginService { private static final EnumSet NO_PHASES = EnumSet.noneOf(Phase.class); diff --git a/loader/src/main/java/net/neoforged/fml/loading/mixin/DeferredMixinConfigRegistration.java b/loader/src/main/java/net/neoforged/fml/loading/mixin/DeferredMixinConfigRegistration.java index 46b7b6138..4c400e92c 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/mixin/DeferredMixinConfigRegistration.java +++ b/loader/src/main/java/net/neoforged/fml/loading/mixin/DeferredMixinConfigRegistration.java @@ -5,8 +5,9 @@ package net.neoforged.fml.loading.mixin; -import net.neoforged.fml.loading.FMLLoader; -import org.apache.logging.log4j.LogManager; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,15 +17,13 @@ import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.transformer.Config; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - public class DeferredMixinConfigRegistration { private static final Logger LOG = LoggerFactory.getLogger("fml-mixin-setup"); private static boolean added = false; + record ConfigInfo(String fileName, @Nullable String modId) {} + private static final List mixinConfigs = new ArrayList<>(); static { @@ -51,8 +50,7 @@ static void registerConfigs() { added = true; mixinConfigs.forEach(cfg -> Mixins.addConfiguration(cfg.fileName())); final var configMap = Mixins.getConfigs().stream().collect( - Collectors.toMap(Config::getName, Config::getConfig) - ); + Collectors.toMap(Config::getName, Config::getConfig)); mixinConfigs.forEach(cfg -> { if (cfg.modId() == null) return; diff --git a/loader/src/main/java/net/neoforged/fml/loading/mixin/FMLMixinContainerHandle.java b/loader/src/main/java/net/neoforged/fml/loading/mixin/FMLMixinContainerHandle.java index b0f0a5ab5..e96f39a1b 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/mixin/FMLMixinContainerHandle.java +++ b/loader/src/main/java/net/neoforged/fml/loading/mixin/FMLMixinContainerHandle.java @@ -5,10 +5,9 @@ package net.neoforged.fml.loading.mixin; -import org.spongepowered.asm.launch.platform.container.IContainerHandle; - import java.util.Collection; import java.util.List; +import org.spongepowered.asm.launch.platform.container.IContainerHandle; /** * Container handle representing all of FML's mixin configs. diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileDependencyLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileDependencyLocator.java index 9c33ff902..0fe4ca55c 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileDependencyLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileDependencyLocator.java @@ -6,30 +6,26 @@ package net.neoforged.fml.loading.moddiscovery; import com.mojang.logging.LogUtils; -import net.neoforged.neoforgespi.locating.IDependencyLocator; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.ModFileLoadingException; -import org.slf4j.Logger; - import java.io.InputStream; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Optional; +import net.neoforged.neoforgespi.locating.IDependencyLocator; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.ModFileLoadingException; +import org.slf4j.Logger; -public abstract class AbstractJarFileDependencyLocator extends AbstractJarFileModProvider implements IDependencyLocator -{ +public abstract class AbstractJarFileDependencyLocator extends AbstractJarFileModProvider implements IDependencyLocator { private static final Logger LOGGER = LogUtils.getLogger(); protected Optional loadResourceFromModFile(final IModFile modFile, final Path path) { try { return Optional.of(Files.newInputStream(modFile.findResource(path.toString()))); - } - catch (final NoSuchFileException e) { + } catch (final NoSuchFileException e) { LOGGER.trace("Failed to load resource {} from {}, it does not contain dependency information.", path, modFile.getFileName()); return Optional.empty(); - } - catch (final Exception e) { + } catch (final Exception e) { LOGGER.error("Failed to load resource {} from mod {}, cause {}", path, modFile.getFileName(), e); return Optional.empty(); } @@ -39,10 +35,9 @@ protected Optional loadModFileFrom(final IModFile file, final Path pat try { final Path pathInModFile = file.findResource(path.toString()); return Optional.of(createMod(pathInModFile).file()); - } - catch (Exception e) { + } catch (Exception e) { LOGGER.error("Failed to load mod file {} from {}", path, file.getFileName()); - throw new ModFileLoadingException("Failed to load mod file "+file.getFileName()); + throw new ModFileLoadingException("Failed to load mod file " + file.getFileName()); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModLocator.java index 25a859e5b..8ac424901 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModLocator.java @@ -5,19 +5,16 @@ package net.neoforged.fml.loading.moddiscovery; -import net.neoforged.neoforgespi.locating.IModLocator; - import java.io.File; import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; +import net.neoforged.neoforgespi.locating.IModLocator; -public abstract class AbstractJarFileModLocator extends AbstractJarFileModProvider implements IModLocator -{ +public abstract class AbstractJarFileModLocator extends AbstractJarFileModProvider implements IModLocator { @Override - public List scanMods() - { + public List scanMods() { return scanCandidates().map(this::createMod).toList(); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModProvider.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModProvider.java index c0147716e..b392bfc80 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractJarFileModProvider.java @@ -7,30 +7,28 @@ import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.SecureJar; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.locating.IModFile; -import org.slf4j.Logger; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.locating.IModFile; +import org.slf4j.Logger; -public abstract class AbstractJarFileModProvider extends AbstractModProvider -{ +public abstract class AbstractJarFileModProvider extends AbstractModProvider { private static final Logger LOGGER = LogUtils.getLogger(); @Override public void scanFile(final IModFile file, final Consumer pathConsumer) { - LOGGER.debug(LogMarkers.SCAN,"Scan started: {}", file); - final Function status = p->file.getSecureJar().verifyPath(p); + LOGGER.debug(LogMarkers.SCAN, "Scan started: {}", file); + final Function status = p -> file.getSecureJar().verifyPath(p); try (Stream files = Files.find(file.getSecureJar().getRootPath(), Integer.MAX_VALUE, (p, a) -> p.getNameCount() > 0 && p.getFileName().toString().endsWith(".class"))) { - file.setSecurityStatus(files.peek(pathConsumer).map(status).reduce((s1, s2)-> SecureJar.Status.values()[Math.min(s1.ordinal(), s2.ordinal())]).orElse(SecureJar.Status.INVALID)); + file.setSecurityStatus(files.peek(pathConsumer).map(status).reduce((s1, s2) -> SecureJar.Status.values()[Math.min(s1.ordinal(), s2.ordinal())]).orElse(SecureJar.Status.INVALID)); } catch (IOException e) { e.printStackTrace(); } - LOGGER.debug(LogMarkers.SCAN,"Scan finished: {}", file); + LOGGER.debug(LogMarkers.SCAN, "Scan finished: {}", file); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractModProvider.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractModProvider.java index a964f4f17..37da5891f 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractModProvider.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/AbstractModProvider.java @@ -8,6 +8,13 @@ import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.JarContentsBuilder; import cpw.mods.jarhandling.SecureJar; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; import net.neoforged.fml.loading.LogMarkers; import net.neoforged.neoforgespi.language.IConfigurable; import net.neoforged.neoforgespi.language.IModFileInfo; @@ -18,17 +25,8 @@ import net.neoforged.neoforgespi.locating.ModFileLoadingException; import org.slf4j.Logger; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -public abstract class AbstractModProvider implements IModProvider -{ - private static final Logger LOGGER = LogUtils.getLogger(); +public abstract class AbstractModProvider implements IModProvider { + private static final Logger LOGGER = LogUtils.getLogger(); public static final String MODS_TOML = "META-INF/neoforge.mods.toml"; protected static final String MANIFEST = "META-INF/MANIFEST.MF"; @@ -51,7 +49,7 @@ protected IModLocator.ModFileOrException createMod(Path... path) { LOGGER.debug(LogMarkers.SCAN, "Found {} mod of type {}: {}", MANIFEST, type, path); mod = new ModFile(SecureJar.from(jarContents), this, this::manifestParser, type); } else { - return new IModLocator.ModFileOrException(null, new ModFileLoadingException("Invalid mod file found "+ Arrays.toString(path))); + return new IModLocator.ModFileOrException(null, new ModFileLoadingException("Invalid mod file found " + Arrays.toString(path))); } return new IModLocator.ModFileOrException(mod, null); @@ -65,6 +63,7 @@ protected IModFileInfo manifestParser(final IModFile mod) { public Optional getConfigElement(String... key) { return Optional.empty(); } + @Override public List getConfigList(String... key) { return Collections.emptyList(); @@ -85,32 +84,70 @@ protected String getDefaultJarModType() { private record DefaultModFileInfo(IModFile mod, String license, IConfigurable configurable) implements IModFileInfo, IConfigurable { @Override - public Optional getConfigElement(final String... strings) - { + public Optional getConfigElement(final String... strings) { return Optional.empty(); } @Override - public List getConfigList(final String... strings) - { + public List getConfigList(final String... strings) { return null; } - @Override public List getMods() { return Collections.emptyList(); } - @Override public List requiredLanguageLoaders() { return Collections.emptyList(); } - @Override public boolean showAsResourcePack() { return false; } - @Override public boolean showAsDataPack() { return false; } - @Override public Map getFileProperties() { return Collections.emptyMap(); } @Override - public String getLicense() { return license; } + public List getMods() { + return Collections.emptyList(); + } + + @Override + public List requiredLanguageLoaders() { + return Collections.emptyList(); + } - @Override public IModFile getFile() { return mod; } - @Override public IConfigurable getConfig() { return configurable; } + @Override + public boolean showAsResourcePack() { + return false; + } + + @Override + public boolean showAsDataPack() { + return false; + } + + @Override + public Map getFileProperties() { + return Collections.emptyMap(); + } + + @Override + public String getLicense() { + return license; + } + + @Override + public IModFile getFile() { + return mod; + } + + @Override + public IConfigurable getConfig() { + return configurable; + } // These Should never be called as it's only called from ModJarMetadata.version and we bypass that - @Override public String moduleName() { return mod.getSecureJar().name(); } - @Override public String versionString() { return null; } - @Override public List usesServices() { return null; } + @Override + public String moduleName() { + return mod.getSecureJar().name(); + } + + @Override + public String versionString() { + return null; + } + + @Override + public List usesServices() { + return null; + } @Override public String toString() { diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/BackgroundScanHandler.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/BackgroundScanHandler.java index a527c85b0..784bc3494 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/BackgroundScanHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/BackgroundScanHandler.java @@ -6,6 +6,15 @@ package net.neoforged.fml.loading.moddiscovery; import com.mojang.logging.LogUtils; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import net.neoforged.fml.loading.FMLConfig; import net.neoforged.fml.loading.ImmediateWindowHandler; import net.neoforged.fml.loading.LoadingModList; @@ -13,15 +22,7 @@ import net.neoforged.neoforgespi.language.ModFileScanData; import org.slf4j.Logger; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; - -public class BackgroundScanHandler -{ +public class BackgroundScanHandler { private enum ScanStatus { NOT_STARTED, RUNNING, @@ -67,26 +68,24 @@ public void submitForScanning(final ModFile file) { pendingFiles.add(file); final CompletableFuture future = CompletableFuture.supplyAsync(file::compileContent, modContentScanner) .whenComplete(file::setScanResult) - .whenComplete((r,t)-> this.addCompletedFile(file,r,t)); + .whenComplete((r, t) -> this.addCompletedFile(file, r, t)); file.setFutureScanResult(future); } private synchronized void addCompletedFile(final ModFile file, final ModFileScanData modFileScanData, final Throwable throwable) { if (throwable != null) { status = ScanStatus.ERRORED; - LOGGER.error(LogMarkers.SCAN,"An error occurred scanning file {}", file, throwable); + LOGGER.error(LogMarkers.SCAN, "An error occurred scanning file {}", file, throwable); } pendingFiles.remove(file); scannedFiles.add(file); } - public void setLoadingModList(LoadingModList loadingModList) - { + public void setLoadingModList(LoadingModList loadingModList) { this.loadingModList = loadingModList; } - public LoadingModList getLoadingModList() - { + public LoadingModList getLoadingModList() { return loadingModList; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ClasspathLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ClasspathLocator.java index 07f69312b..2f9ac8f62 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ClasspathLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ClasspathLocator.java @@ -5,11 +5,7 @@ package net.neoforged.fml.loading.moddiscovery; -import net.neoforged.fml.loading.ClasspathLocatorUtils; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.LogMarkers; -import org.slf4j.Logger; - import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -22,9 +18,11 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; +import net.neoforged.fml.loading.ClasspathLocatorUtils; +import net.neoforged.fml.loading.LogMarkers; +import org.slf4j.Logger; -public class ClasspathLocator extends AbstractJarFileModLocator -{ +public class ClasspathLocator extends AbstractJarFileModLocator { private static final Logger LOGGER = LogUtils.getLogger(); private final List legacyClasspath = AbstractJarFileModLocator.getLegacyClasspath(); private boolean enabled = false; @@ -80,13 +78,13 @@ private Path findJarPathFor(final String resourceName, final String jarName, fin int lastExcl = uri.getRawSchemeSpecificPart().lastIndexOf("!/"); path = Paths.get(new URI(uri.getRawSchemeSpecificPart().substring(0, lastExcl))); } else { - path = Paths.get(new URI("file://"+uri.getRawSchemeSpecificPart().substring(0, uri.getRawSchemeSpecificPart().length()-resourceName.length()))); + path = Paths.get(new URI("file://" + uri.getRawSchemeSpecificPart().substring(0, uri.getRawSchemeSpecificPart().length() - resourceName.length()))); } //LOGGER.debug(CORE, "Found JAR {} at path {}", jarName, path.toString()); return path; } catch (NullPointerException | URISyntaxException e) { LOGGER.error(LogMarkers.SCAN, "Failed to find JAR for class {} - {}", resourceName, jarName); - throw new RuntimeException("Unable to locate "+resourceName+" - "+jarName, e); + throw new RuntimeException("Unable to locate " + resourceName + " - " + jarName, e); } } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/CoreModFile.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/CoreModFile.java index 727690c39..5f6ffb47c 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/CoreModFile.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/CoreModFile.java @@ -5,12 +5,11 @@ package net.neoforged.fml.loading.moddiscovery; -import net.neoforged.coremod.ICoreModScriptSource; - import java.io.IOException; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; +import net.neoforged.coremod.ICoreModScriptSource; public class CoreModFile implements ICoreModScriptSource { private final Path internalPath; diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ExplodedDirectoryLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ExplodedDirectoryLocator.java index fcabd171c..f748c58f9 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ExplodedDirectoryLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ExplodedDirectoryLocator.java @@ -8,11 +8,6 @@ import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.JarContentsBuilder; import cpw.mods.jarhandling.SecureJar; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.IModLocator; -import org.slf4j.Logger; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -22,6 +17,10 @@ import java.util.Map; import java.util.function.Consumer; import java.util.stream.Stream; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.IModLocator; +import org.slf4j.Logger; public class ExplodedDirectoryLocator implements IModLocator { private static final Logger LOGGER = LogUtils.getLogger(); @@ -44,7 +43,7 @@ public List scanMods() { LOGGER.warn(LogMarkers.LOADING, "Failed to find exploded resource {} in directory {}", AbstractModProvider.MODS_TOML, explodedMod.paths().get(0).toString()); } }); - return mods.values().stream().map(mf->new IModLocator.ModFileOrException(mf, null)).toList(); + return mods.values().stream().map(mf -> new IModLocator.ModFileOrException(mf, null)).toList(); } @Override @@ -54,18 +53,17 @@ public String name() { @Override public void scanFile(final IModFile file, final Consumer pathConsumer) { - LOGGER.debug(LogMarkers.SCAN,"Scanning exploded directory {}", file.getFilePath().toString()); + LOGGER.debug(LogMarkers.SCAN, "Scanning exploded directory {}", file.getFilePath().toString()); try (Stream files = Files.find(file.getSecureJar().getRootPath(), Integer.MAX_VALUE, (p, a) -> p.getNameCount() > 0 && p.getFileName().toString().endsWith(".class"))) { files.forEach(pathConsumer); } catch (IOException e) { e.printStackTrace(); } - LOGGER.debug(LogMarkers.SCAN,"Exploded directory scan complete {}", file.getFilePath().toString()); + LOGGER.debug(LogMarkers.SCAN, "Exploded directory scan complete {}", file.getFilePath().toString()); } @Override - public String toString() - { + public String toString() { return "{ExplodedDir locator}"; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModFileException.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModFileException.java index 6ba3035ae..32a591713 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModFileException.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModFileException.java @@ -5,19 +5,16 @@ package net.neoforged.fml.loading.moddiscovery; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.locating.ModFileLoadingException; - import java.util.Locale; import java.util.Optional; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.locating.ModFileLoadingException; -public class InvalidModFileException extends ModFileLoadingException -{ +public class InvalidModFileException extends ModFileLoadingException { private final IModFileInfo modFileInfo; - public InvalidModFileException(String message, IModFileInfo modFileInfo) - { - super(String.format(Locale.ROOT, "%s (%s)", message, Optional.ofNullable(modFileInfo).map(mf->mf.getFile().getFileName()).orElse("MISSING FILE NAME"))); + public InvalidModFileException(String message, IModFileInfo modFileInfo) { + super(String.format(Locale.ROOT, "%s (%s)", message, Optional.ofNullable(modFileInfo).map(mf -> mf.getFile().getFileName()).orElse("MISSING FILE NAME"))); this.modFileInfo = modFileInfo; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModIdentifier.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModIdentifier.java index 6f45d1e19..9f8aa80f8 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModIdentifier.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/InvalidModIdentifier.java @@ -6,48 +6,39 @@ package net.neoforged.fml.loading.moddiscovery; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import net.neoforged.fml.loading.StringUtils; - import java.nio.file.Path; import java.util.Arrays; import java.util.Optional; import java.util.function.BiPredicate; import java.util.zip.ZipFile; +import net.neoforged.fml.loading.StringUtils; public enum InvalidModIdentifier { - OLDFORGE(filePresent("mcmod.info")), FABRIC(filePresent("fabric.mod.json")), LITELOADER(filePresent("litemod.json")), OPTIFINE(filePresent("optifine/Installer.class")), BUKKIT(filePresent("plugin.yml")), - INVALIDZIP((f,zf) -> !zf.isPresent()); + INVALIDZIP((f, zf) -> !zf.isPresent()); private BiPredicate> ident; - InvalidModIdentifier(BiPredicate> identifier) - { + InvalidModIdentifier(BiPredicate> identifier) { this.ident = identifier; } - private String getReason() - { + private String getReason() { return "fml.modloading.brokenfile." + StringUtils.toLowerCase(name()); } - public static Optional identifyJarProblem(Path path) - { + public static Optional identifyJarProblem(Path path) { Optional zfo = tryOpenFile(path); - Optional result = Arrays.stream(values()). - filter(i -> i.ident.test(path, zfo)). - map(InvalidModIdentifier::getReason). - findAny(); + Optional result = Arrays.stream(values()).filter(i -> i.ident.test(path, zfo)).map(InvalidModIdentifier::getReason).findAny(); zfo.ifPresent(LambdaExceptionUtils.rethrowConsumer(ZipFile::close)); return result; } - private static BiPredicate> filePresent(String filename) - { + private static BiPredicate> filePresent(String filename) { return (f, zfo) -> zfo.map(zf -> zf.getEntry(filename) != null).orElse(false); } @@ -58,5 +49,4 @@ private static Optional tryOpenFile(Path path) { return Optional.empty(); } } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/JarInJarDependencyLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/JarInJarDependencyLocator.java index c6108658e..5894b4371 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/JarInJarDependencyLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/JarInJarDependencyLocator.java @@ -8,16 +8,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.EarlyLoadingException; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.ModFileLoadingException; -import net.neoforged.jarjar.selection.JarSelector; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.artifact.versioning.VersionRange; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; - import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.FileSystems; @@ -29,27 +19,31 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.neoforged.fml.loading.EarlyLoadingException; +import net.neoforged.jarjar.selection.JarSelector; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.ModFileLoadingException; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.VersionRange; +import org.slf4j.Logger; -public class JarInJarDependencyLocator extends AbstractJarFileDependencyLocator -{ +public class JarInJarDependencyLocator extends AbstractJarFileDependencyLocator { private static final Logger LOGGER = LogUtils.getLogger(); @Override - public String name() - { + public String name() { return "JarInJar"; } @Override - public List scanMods(final Iterable loadedMods) - { + public List scanMods(final Iterable loadedMods) { final List sources = Lists.newArrayList(); loadedMods.forEach(sources::add); final List dependenciesToLoad = JarSelector.detectAndSelect(sources, this::loadResourceFromModFile, this::loadModFileFrom, this::identifyMod, this::exception); - if (dependenciesToLoad.isEmpty()) - { + if (dependenciesToLoad.isEmpty()) { LOGGER.info("No dependencies to load found. Skipping!"); return Collections.emptyList(); } @@ -59,32 +53,26 @@ public List scanMods(final Iterable loadedMods) } @Override - public void initArguments(final Map arguments) - { + public void initArguments(final Map arguments) { // NO-OP, for now } @Override - protected String getDefaultJarModType() - { + protected String getDefaultJarModType() { return IModFile.Type.LIBRARY.name(); } @SuppressWarnings("resource") @Override - protected Optional loadModFileFrom(final IModFile file, final Path path) - { - try - { + protected Optional loadModFileFrom(final IModFile file, final Path path) { + try { final Path pathInModFile = file.findResource(path.toString()); final URI filePathUri = new URI("jij:" + (pathInModFile.toAbsolutePath().toUri().getRawSchemeSpecificPart())).normalize(); final Map outerFsArgs = ImmutableMap.of("packagePath", pathInModFile); final FileSystem zipFS = FileSystems.newFileSystem(filePathUri, outerFsArgs); final Path pathInFS = zipFS.getPath("/"); return Optional.of(createMod(pathInFS).file()); - } - catch (Exception e) - { + } catch (Exception e) { LOGGER.error("Failed to load mod file {} from {}", path, file.getFileName()); final RuntimeException exception = new ModFileLoadingException("Failed to load mod file " + file.getFileName()); exception.initCause(e); @@ -93,66 +81,50 @@ protected Optional loadModFileFrom(final IModFile file, final Path pat } } - protected EarlyLoadingException exception(Collection> failedDependencies) - { - + protected EarlyLoadingException exception(Collection> failedDependencies) { final List errors = failedDependencies.stream() - .filter(entry -> !entry.sources().isEmpty()) //Should never be the case, but just to be sure - .map(this::buildExceptionData) - .toList(); + .filter(entry -> !entry.sources().isEmpty()) //Should never be the case, but just to be sure + .map(this::buildExceptionData) + .toList(); return new EarlyLoadingException(failedDependencies.size() + " Dependency restrictions were not met.", null, errors); } - @NotNull - private EarlyLoadingException.ExceptionData buildExceptionData(final JarSelector.ResolutionFailureInformation entry) - { + private EarlyLoadingException.ExceptionData buildExceptionData(final JarSelector.ResolutionFailureInformation entry) { return new EarlyLoadingException.ExceptionData( getErrorTranslationKey(entry), entry.identifier().group() + ":" + entry.identifier().artifact(), entry.sources() - .stream() - .flatMap(this::getModWithVersionRangeStream) - .map(this::formatError) - .collect(Collectors.joining(", ")) - ); + .stream() + .flatMap(this::getModWithVersionRangeStream) + .map(this::formatError) + .collect(Collectors.joining(", "))); } - @NotNull - private String getErrorTranslationKey(final JarSelector.ResolutionFailureInformation entry) - { - return entry.failureReason() == JarSelector.FailureReason.VERSION_RESOLUTION_FAILED ? - "fml.dependencyloading.conflictingdependencies" : - "fml.dependencyloading.mismatchedcontaineddependencies"; + private String getErrorTranslationKey(final JarSelector.ResolutionFailureInformation entry) { + return entry.failureReason() == JarSelector.FailureReason.VERSION_RESOLUTION_FAILED ? "fml.dependencyloading.conflictingdependencies" : "fml.dependencyloading.mismatchedcontaineddependencies"; } - @NotNull - private Stream getModWithVersionRangeStream(final JarSelector.SourceWithRequestedVersionRange file) - { + private Stream getModWithVersionRangeStream(final JarSelector.SourceWithRequestedVersionRange file) { return file.sources() - .stream() - .map(IModFile::getModFileInfo) - .flatMap(modFileInfo -> modFileInfo.getMods().stream()) - .map(modInfo -> new ModWithVersionRange(modInfo, file.requestedVersionRange(), file.includedVersion())); + .stream() + .map(IModFile::getModFileInfo) + .flatMap(modFileInfo -> modFileInfo.getMods().stream()) + .map(modInfo -> new ModWithVersionRange(modInfo, file.requestedVersionRange(), file.includedVersion())); } - @NotNull - private String formatError(final ModWithVersionRange modWithVersionRange) - { + private String formatError(final ModWithVersionRange modWithVersionRange) { return "\u00a7e" + modWithVersionRange.modInfo().getModId() + "\u00a7r - \u00a74" + modWithVersionRange.versionRange().toString() + "\u00a74 - \u00a72" + modWithVersionRange.artifactVersion().toString() + "\u00a72"; } @Override - protected String identifyMod(final IModFile modFile) - { - if (modFile.getModFileInfo() == null || modFile.getModInfos().isEmpty()) - { + protected String identifyMod(final IModFile modFile) { + if (modFile.getModFileInfo() == null || modFile.getModInfos().isEmpty()) { return modFile.getFileName(); } return modFile.getModInfos().stream().map(IModInfo::getModId).collect(Collectors.joining()); } - private record ModWithVersionRange(IModInfo modInfo, VersionRange versionRange, ArtifactVersion artifactVersion) - {} + private record ModWithVersionRange(IModInfo modInfo, VersionRange versionRange, ArtifactVersion artifactVersion) {} } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MavenDirectoryLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MavenDirectoryLocator.java index a70f1f414..f3d6c7486 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MavenDirectoryLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MavenDirectoryLocator.java @@ -5,18 +5,16 @@ package net.neoforged.fml.loading.moddiscovery; -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.loading.MavenCoordinateResolver; - import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.fml.loading.MavenCoordinateResolver; -public class MavenDirectoryLocator extends AbstractJarFileModLocator -{ +public class MavenDirectoryLocator extends AbstractJarFileModLocator { private List modCoords; @Override @@ -30,7 +28,7 @@ public String name() { } public String toString() { - return "{Maven Directory locator for mods "+this.modCoords+"}"; + return "{Maven Directory locator for mods " + this.modCoords + "}"; } @SuppressWarnings("unchecked") @@ -41,7 +39,7 @@ public void initArguments(final Map arguments) { final List mods = (List) arguments.get("mods"); final List listedMods = ModListHandler.processModLists((List) arguments.get("modLists"), mavenRootPaths); - List localModCoords = Stream.concat(mods.stream(),listedMods.stream()).map(MavenCoordinateResolver::get).collect(Collectors.toList()); + List localModCoords = Stream.concat(mods.stream(), listedMods.stream()).map(MavenCoordinateResolver::get).collect(Collectors.toList()); // find the modCoords path in each supplied maven path, and turn it into a mod file. (skips not found files) this.modCoords = localModCoords.stream().map(mc -> mavenRootPaths.stream().map(root -> root.resolve(mc)).filter(path -> Files.exists(path)).findFirst().orElseThrow(() -> new IllegalArgumentException("Failed to locate requested mod coordinate " + mc))).collect(Collectors.toList()); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MinecraftLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MinecraftLocator.java index 44b347739..d1ae069f8 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MinecraftLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/MinecraftLocator.java @@ -9,15 +9,6 @@ import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.JarContentsBuilder; import cpw.mods.jarhandling.SecureJar; -import net.neoforged.fml.loading.ClasspathTransformerDiscoverer; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.IModLocator; -import net.neoforged.neoforgespi.locating.ModFileFactory; -import org.slf4j.Logger; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -27,9 +18,16 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.neoforged.fml.loading.ClasspathTransformerDiscoverer; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.IModLocator; +import net.neoforged.neoforgespi.locating.ModFileFactory; +import org.slf4j.Logger; -public class MinecraftLocator extends AbstractModProvider implements IModLocator -{ +public class MinecraftLocator extends AbstractModProvider implements IModLocator { private static final Logger LOGGER = LogUtils.getLogger(); @Override @@ -66,13 +64,12 @@ private IModFileInfo buildMinecraftTOML(final IModFile iModFile) { LOGGER.fatal(LOADING, "Mod file {} is missing minecraftmod.toml file", modFile.getFilePath()); return null; } - + final FileConfig mcmodstomlfile = FileConfig.builder(mcmodtoml).build(); mcmodstomlfile.load(); mcmodstomlfile.close(); */ - // We haven't changed this in years, and I can't be asked right now to special case this one file in the path. final var conf = Config.inMemory(); conf.set("modLoader", "minecraft"); @@ -89,7 +86,7 @@ private IModFileInfo buildMinecraftTOML(final IModFile iModFile) { conf.set("mods", List.of(mods)); /* conf.putAll(mcmodstomlfile); - + final var extralangs = Stream.builder(); final Path forgemodtoml = modFile.findResource("META-INF", "mods.toml"); if (Files.notExists(forgemodtoml)) { @@ -104,7 +101,6 @@ private IModFileInfo buildMinecraftTOML(final IModFile iModFile) { } */ - final NightConfigWrapper configWrapper = new NightConfigWrapper(conf); //final ModFileInfo modFileInfo = new ModFileInfo(modFile, configWrapper, extralangs.build().toList()); return new ModFileInfo(modFile, configWrapper, configWrapper::setFile, List.of()); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotation.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotation.java index fadef6dae..8a325cded 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotation.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotation.java @@ -5,120 +5,107 @@ package net.neoforged.fml.loading.moddiscovery; +import com.google.common.base.MoreObjects; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import java.lang.annotation.ElementType; import java.util.ArrayList; import java.util.Map; - import net.neoforged.neoforgespi.language.ModFileScanData; import org.objectweb.asm.Type; -import com.google.common.base.MoreObjects; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -public class ModAnnotation -{ +public class ModAnnotation { public static ModFileScanData.AnnotationData fromModAnnotation(final Type clazz, final ModAnnotation annotation) { return new ModFileScanData.AnnotationData(annotation.asmType, annotation.type, clazz, annotation.member, annotation.values); } - public static class EnumHolder - { + public static class EnumHolder { private final String desc; private final String value; - public EnumHolder(String desc, String value) - { + public EnumHolder(String desc, String value) { this.desc = desc; this.value = value; } - public String getDesc() - { + public String getDesc() { return desc; } - public String getValue() - { + public String getValue() { return value; } } + private final ElementType type; private final Type asmType; private final String member; - private final Map values = Maps.newHashMap(); + private final Map values = Maps.newHashMap(); private ArrayList arrayList; private String arrayName; - public ModAnnotation(ElementType type, Type asmType, String member) - { + + public ModAnnotation(ElementType type, Type asmType, String member) { this.type = type; this.asmType = asmType; this.member = member; } - - public ModAnnotation(Type asmType, ModAnnotation parent) - { + + public ModAnnotation(Type asmType, ModAnnotation parent) { this.type = parent.type; this.asmType = asmType; this.member = parent.member; } + @Override - public String toString() - { + public String toString() { return MoreObjects.toStringHelper("Annotation") - .add("type",type) - .add("name",asmType.getClassName()) - .add("member",member) + .add("type", type) + .add("name", asmType.getClassName()) + .add("member", member) .add("values", values) .toString(); } - public ElementType getType() - { + public ElementType getType() { return type; } - public Type getASMType() - { + + public Type getASMType() { return asmType; } - public String getMember() - { + + public String getMember() { return member; } - public Map getValues() - { + + public Map getValues() { return values; } - public void addArray(String name) - { + + public void addArray(String name) { this.arrayList = Lists.newArrayList(); this.arrayName = name; } - public void addProperty(String key, Object value) - { - if (this.arrayList != null) - { + + public void addProperty(String key, Object value) { + if (this.arrayList != null) { arrayList.add(value); - } - else - { + } else { values.put(key, value); } } - public void addEnumProperty(String key, String enumName, String value) - { + public void addEnumProperty(String key, String enumName, String value) { addProperty(key, new EnumHolder(enumName, value)); } - public void endArray() - { + public void endArray() { values.put(arrayName, arrayList); arrayList = null; } - public ModAnnotation addChildAnnotation(String name, String desc) - { + + public ModAnnotation addChildAnnotation(String name, String desc) { ModAnnotation child = new ModAnnotation(Type.getType(desc), this); addProperty(name, child.getValues()); return child; diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotationVisitor.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotationVisitor.java index ce0daae26..3fdeeeb81 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotationVisitor.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModAnnotationVisitor.java @@ -5,75 +5,65 @@ package net.neoforged.fml.loading.moddiscovery; +import java.util.LinkedList; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; -import java.util.LinkedList; - -public class ModAnnotationVisitor extends AnnotationVisitor -{ +public class ModAnnotationVisitor extends AnnotationVisitor { private final ModAnnotation annotation; private LinkedList annotations; private boolean array; private String name; private boolean isSubAnnotation; - public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation) - { + public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation) { super(Opcodes.ASM9); this.annotations = annotations; this.annotation = annotation; } - public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation, String name) - { + public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation, String name) { this(annotations, annotation); this.array = true; this.name = name; annotation.addArray(name); } - public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation, boolean isSubAnnotation) - { + public ModAnnotationVisitor(LinkedList annotations, ModAnnotation annotation, boolean isSubAnnotation) { this(annotations, annotation); this.isSubAnnotation = true; } @Override - public void visit(String key, Object value) - { + public void visit(String key, Object value) { annotation.addProperty(key, value); } @Override - public void visitEnum(String name, String desc, String value) - { + public void visitEnum(String name, String desc, String value) { annotation.addEnumProperty(name, desc, value); } @Override - public AnnotationVisitor visitArray(String name) - { + public AnnotationVisitor visitArray(String name) { return new ModAnnotationVisitor(annotations, annotation, name); } + @Override - public AnnotationVisitor visitAnnotation(String name, String desc) - { + public AnnotationVisitor visitAnnotation(String name, String desc) { ModAnnotation ma = annotations.getFirst(); final ModAnnotation childAnnotation = ma.addChildAnnotation(name, desc); annotations.addFirst(childAnnotation); - return new ModAnnotationVisitor(annotations, childAnnotation,true); + return new ModAnnotationVisitor(annotations, childAnnotation, true); } + @Override - public void visitEnd() - { - if (array) - { + public void visitEnd() { + if (array) { annotation.endArray(); } - if (isSubAnnotation) - { + if (isSubAnnotation) { ModAnnotation child = annotations.removeFirst(); annotations.addLast(child); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModClassVisitor.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModClassVisitor.java index 7d337abbc..ba04b8a96 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModClassVisitor.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModClassVisitor.java @@ -5,6 +5,12 @@ package net.neoforged.fml.loading.moddiscovery; +import java.lang.annotation.ElementType; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import net.neoforged.neoforgespi.language.ModFileScanData; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; @@ -13,60 +19,43 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import java.lang.annotation.ElementType; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ModClassVisitor extends ClassVisitor -{ +public class ModClassVisitor extends ClassVisitor { private Type asmType; private Type asmSuperType; private Set interfaces; private final LinkedList annotations = new LinkedList<>(); - public ModClassVisitor() - { + + public ModClassVisitor() { super(Opcodes.ASM9); } - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) - { + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { this.asmType = Type.getObjectType(name); this.asmSuperType = superName != null && superName.length() > 0 ? Type.getObjectType(superName) : null; this.interfaces = Stream.of(interfaces).map(Type::getObjectType).collect(Collectors.toSet()); } @Override - public AnnotationVisitor visitAnnotation(final String annotationName, final boolean runtimeVisible) - { + public AnnotationVisitor visitAnnotation(final String annotationName, final boolean runtimeVisible) { ModAnnotation ann = new ModAnnotation(ElementType.TYPE, Type.getType(annotationName), this.asmType.getClassName()); annotations.addFirst(ann); return new ModAnnotationVisitor(annotations, ann); } - @Override - public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) - { + public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return new ModFieldVisitor(name, annotations); } @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) - { + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { return new ModMethodVisitor(name, desc, annotations); } public void buildData(final Set classes, final Set annotations) { classes.add(new ModFileScanData.ClassData(this.asmType, this.asmSuperType, this.interfaces)); - final List collect = this.annotations.stream(). - filter(ma->ModFileScanData.interestingAnnotations().test(ma.getASMType())). - map(a -> ModAnnotation.fromModAnnotation(this.asmType, a)).collect(Collectors.toList()); + final List collect = this.annotations.stream().filter(ma -> ModFileScanData.interestingAnnotations().test(ma.getASMType())).map(a -> ModAnnotation.fromModAnnotation(this.asmType, a)).collect(Collectors.toList()); annotations.addAll(collect); } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModDiscoverer.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModDiscoverer.java index 38ab45dec..a0d5733a7 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModDiscoverer.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModDiscoverer.java @@ -11,6 +11,12 @@ import cpw.mods.modlauncher.Launcher; import cpw.mods.modlauncher.api.IModuleLayerManager; import cpw.mods.modlauncher.util.ServiceLoaderUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.ServiceLoader; +import java.util.stream.Collectors; import net.neoforged.fml.loading.EarlyLoadingException; import net.neoforged.fml.loading.ImmediateWindowHandler; import net.neoforged.fml.loading.LogMarkers; @@ -23,46 +29,39 @@ import net.neoforged.neoforgespi.locating.IModLocator; import org.slf4j.Logger; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.ServiceLoader; -import java.util.stream.Collectors; - public class ModDiscoverer { private static final Logger LOGGER = LogUtils.getLogger(); private final ServiceLoader modLocators; private final ServiceLoader dependencyLocators; - private final List modLocatorList; - private final List dependencyLocatorList; + private final List modLocatorList; + private final List dependencyLocatorList; public ModDiscoverer(Map arguments) { - Launcher.INSTANCE.environment().computePropertyIfAbsent(Environment.Keys.MODDIRECTORYFACTORY.get(), v->ModsFolderLocator::new); - Launcher.INSTANCE.environment().computePropertyIfAbsent(Environment.Keys.PROGRESSMESSAGE.get(), v-> StartupNotificationManager.locatorConsumer().orElseGet(()-> s->{})); + Launcher.INSTANCE.environment().computePropertyIfAbsent(Environment.Keys.MODDIRECTORYFACTORY.get(), v -> ModsFolderLocator::new); + Launcher.INSTANCE.environment().computePropertyIfAbsent(Environment.Keys.PROGRESSMESSAGE.get(), v -> StartupNotificationManager.locatorConsumer().orElseGet(() -> s -> {})); final var moduleLayerManager = Launcher.INSTANCE.environment().findModuleLayerManager().orElseThrow(); modLocators = ServiceLoader.load(moduleLayerManager.getLayer(IModuleLayerManager.Layer.SERVICE).orElseThrow(), IModLocator.class); dependencyLocators = ServiceLoader.load(moduleLayerManager.getLayer(IModuleLayerManager.Layer.SERVICE).orElseThrow(), IDependencyLocator.class); - modLocatorList = ServiceLoaderUtils.streamServiceLoader(()-> modLocators, sce->LOGGER.error("Failed to load mod locator list", sce)).collect(Collectors.toList()); - modLocatorList.forEach(l->l.initArguments(arguments)); - dependencyLocatorList = ServiceLoaderUtils.streamServiceLoader(()-> dependencyLocators, sce->LOGGER.error("Failed to load dependency locator list", sce)).collect(Collectors.toList()); - dependencyLocatorList.forEach(l->l.initArguments(arguments)); - if (LOGGER.isDebugEnabled(LogMarkers.CORE)) - { + modLocatorList = ServiceLoaderUtils.streamServiceLoader(() -> modLocators, sce -> LOGGER.error("Failed to load mod locator list", sce)).collect(Collectors.toList()); + modLocatorList.forEach(l -> l.initArguments(arguments)); + dependencyLocatorList = ServiceLoaderUtils.streamServiceLoader(() -> dependencyLocators, sce -> LOGGER.error("Failed to load dependency locator list", sce)).collect(Collectors.toList()); + dependencyLocatorList.forEach(l -> l.initArguments(arguments)); + if (LOGGER.isDebugEnabled(LogMarkers.CORE)) { LOGGER.debug(LogMarkers.CORE, "Found Mod Locators : {}", modLocatorList.stream() - .map(modLocator -> "(%s:%s)".formatted(modLocator.name(), - modLocator.getClass().getPackage().getImplementationVersion())).collect(Collectors.joining(","))); + .map(modLocator -> "(%s:%s)".formatted(modLocator.name(), + modLocator.getClass().getPackage().getImplementationVersion())) + .collect(Collectors.joining(","))); } - if (LOGGER.isDebugEnabled(LogMarkers.CORE)) - { + if (LOGGER.isDebugEnabled(LogMarkers.CORE)) { LOGGER.debug(LogMarkers.CORE, "Found Dependency Locators : {}", dependencyLocatorList.stream() - .map(dependencyLocator -> "(%s:%s)".formatted(dependencyLocator.name(), - dependencyLocator.getClass().getPackage().getImplementationVersion())).collect(Collectors.joining(","))); + .map(dependencyLocator -> "(%s:%s)".formatted(dependencyLocator.name(), + dependencyLocator.getClass().getPackage().getImplementationVersion())) + .collect(Collectors.joining(","))); } } public ModValidator discoverMods() { - LOGGER.debug(LogMarkers.SCAN,"Scanning for mods and other resources to load. We know {} ways to find mods", modLocatorList.size()); + LOGGER.debug(LogMarkers.SCAN, "Scanning for mods and other resources to load. We know {} ways to find mods", modLocatorList.size()); List loadedFiles = new ArrayList<>(); List discoveryErrorData = new ArrayList<>(); boolean successfullyLoadedMods = true; @@ -77,7 +76,7 @@ public ModValidator discoverMods() { var exceptions = candidates.stream().map(IModLocator.ModFileOrException::ex).filter(Objects::nonNull).toList(); if (!exceptions.isEmpty()) { LOGGER.debug(LogMarkers.SCAN, "Locator {} found {} invalid mod files", locator, exceptions.size()); - brokenFiles.addAll(exceptions.stream().map(e->e instanceof InvalidModFileException ime ? ime.getBrokenFile() : null).filter(Objects::nonNull).toList()); + brokenFiles.addAll(exceptions.stream().map(e -> e instanceof InvalidModFileException ime ? ime.getBrokenFile() : null).filter(Objects::nonNull).toList()); } var locatedFiles = candidates.stream().map(IModLocator.ModFileOrException::file).filter(Objects::nonNull).collect(Collectors.toList()); @@ -108,10 +107,9 @@ public ModValidator discoverMods() { //Grab the temporary results. //This allows loading to continue to a base state, in case dependency loading fails. modFilesMap = uniqueModsData.modFiles().stream() - .collect(Collectors.groupingBy(IModFile::getType)); + .collect(Collectors.groupingBy(IModFile::getType)); loadedFiles = uniqueModsData.modFiles(); - } - catch (EarlyLoadingException exception) { + } catch (EarlyLoadingException exception) { LOGGER.error(LogMarkers.SCAN, "Failed to build unique mod list after mod discovery.", exception); discoveryErrorData.addAll(exception.getAllData()); successfullyLoadedMods = false; @@ -122,7 +120,7 @@ public ModValidator discoverMods() { LOGGER.debug(LogMarkers.SCAN, "Successfully Loaded {} mods. Attempting to load dependencies...", loadedFiles.size()); for (IDependencyLocator locator : dependencyLocatorList) { try { - LOGGER.debug(LogMarkers.SCAN,"Trying locator {}", locator); + LOGGER.debug(LogMarkers.SCAN, "Trying locator {}", locator); final List locatedMods = ImmutableList.copyOf(loadedFiles); var locatedFiles = locator.scanMods(locatedMods); @@ -131,8 +129,7 @@ public ModValidator discoverMods() { } handleLocatedFiles(loadedFiles, locatedFiles); - } - catch (EarlyLoadingException exception) { + } catch (EarlyLoadingException exception) { LOGGER.error(LogMarkers.SCAN, "Failed to load dependencies with locator {}", locator, exception); discoveryErrorData.addAll(exception.getAllData()); } @@ -145,14 +142,13 @@ public ModValidator discoverMods() { //We now only need the mod files map, not the list. modFilesMap = uniqueModsAndDependenciesData.modFiles().stream() - .collect(Collectors.groupingBy(IModFile::getType)); + .collect(Collectors.groupingBy(IModFile::getType)); } catch (EarlyLoadingException exception) { LOGGER.error(LogMarkers.SCAN, "Failed to build unique mod list after dependency discovery.", exception); discoveryErrorData.addAll(exception.getAllData()); modFilesMap = loadedFiles.stream().collect(Collectors.groupingBy(IModFile::getType)); } - } - else { + } else { //Failure notify the listeners. LOGGER.error(LogMarkers.SCAN, "Mod Discovery failed. Skipping dependency discovery."); } @@ -164,8 +160,7 @@ public ModValidator discoverMods() { return validator; } - private void handleLocatedFiles(final List loadedFiles, final List locatedFiles) - { + private void handleLocatedFiles(final List loadedFiles, final List locatedFiles) { var locatedModFiles = locatedFiles.stream().filter(ModFile.class::isInstance).map(ModFile.class::cast).toList(); for (IModFile mf : locatedModFiles) { LOGGER.info(LogMarkers.SCAN, "Found mod file \"{}\" of type {} with provider {}", mf.getFileName(), mf.getType(), mf.getProvider()); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFieldVisitor.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFieldVisitor.java index 08001252f..8b08032a5 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFieldVisitor.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFieldVisitor.java @@ -5,29 +5,25 @@ package net.neoforged.fml.loading.moddiscovery; +import java.lang.annotation.ElementType; +import java.util.LinkedList; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import java.lang.annotation.ElementType; -import java.util.LinkedList; - -public class ModFieldVisitor extends FieldVisitor -{ +public class ModFieldVisitor extends FieldVisitor { private final LinkedList annotations; private final String fieldName; - public ModFieldVisitor(String name, final LinkedList annotations) - { + public ModFieldVisitor(String name, final LinkedList annotations) { super(Opcodes.ASM9); this.fieldName = name; this.annotations = annotations; } - + @Override - public AnnotationVisitor visitAnnotation(String annotationName, boolean runtimeVisible) - { + public AnnotationVisitor visitAnnotation(String annotationName, boolean runtimeVisible) { ModAnnotation ann = new ModAnnotation(ElementType.FIELD, Type.getType(annotationName), fieldName); annotations.addFirst(ann); return new ModAnnotationVisitor(annotations, ann); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java index 15944d890..182eef004 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java @@ -8,19 +8,6 @@ import com.google.common.collect.ImmutableMap; import com.mojang.logging.LogUtils; import cpw.mods.jarhandling.SecureJar; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.language.IModLanguageProvider; -import net.neoforged.neoforgespi.language.ModFileScanData; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.IModProvider; -import net.neoforged.neoforgespi.locating.ModFileFactory; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.artifact.versioning.DefaultArtifactVersion; -import org.slf4j.Logger; - import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -34,6 +21,18 @@ import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.stream.Stream; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.IModLanguageProvider; +import net.neoforged.neoforgespi.language.ModFileScanData; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.IModProvider; +import net.neoforged.neoforgespi.locating.ModFileFactory; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.slf4j.Logger; public class ModFile implements IModFile { private static final Logger LOGGER = LogUtils.getLogger(); @@ -45,9 +44,9 @@ public class ModFile implements IModFile { private Throwable scanError; private final SecureJar jar; private final Type modFileType; - private final Manifest manifest; + private final Manifest manifest; private final IModProvider provider; - private IModFileInfo modFileInfo; + private IModFileInfo modFileInfo; private ModFileScanData fileModFileScanData; private volatile CompletableFuture futureScanResult; private List coreMods; @@ -73,9 +72,10 @@ public ModFile(final SecureJar jar, final IModProvider provider, final ModFileFa } @Override - public Supplier> getSubstitutionMap() { - return () -> ImmutableMap.builder().put("jarVersion", jarVersion).putAll(fileProperties).build(); + public Supplier> getSubstitutionMap() { + return () -> ImmutableMap.builder().put("jarVersion", jarVersion).putAll(fileProperties).build(); } + @Override public Type getType() { return modFileType; @@ -103,11 +103,11 @@ public List getAccessTransformers() { public boolean identifyMods() { this.modFileInfo = ModFileParser.readModList(this, this.parser); if (this.modFileInfo == null) return this.getType() != Type.MOD; - LOGGER.debug(LogMarkers.LOADING,"Loading mod file {} with languages {}", this.getFilePath(), this.modFileInfo.requiredLanguageLoaders()); + LOGGER.debug(LogMarkers.LOADING, "Loading mod file {} with languages {}", this.getFilePath(), this.modFileInfo.requiredLanguageLoaders()); this.coreMods = ModFileParser.getCoreMods(this); - this.coreMods.forEach(mi-> LOGGER.debug(LogMarkers.LOADING,"Found coremod {}", mi.getDebugSource())); + this.coreMods.forEach(mi -> LOGGER.debug(LogMarkers.LOADING, "Found coremod {}", mi.getDebugSource())); this.mixinConfigs = ModFileParser.getMixinConfigs(this.modFileInfo); - this.mixinConfigs.forEach(mc -> LOGGER.debug(LogMarkers.LOADING,"Found mixin config {}", mc)); + this.mixinConfigs.forEach(mc -> LOGGER.debug(LogMarkers.LOADING, "Found mixin config {}", mc)); this.accessTransformers = ModFileParser.getAccessTransformers(this.modFileInfo) .map(list -> list.stream().map(this::findResource).filter(path -> { if (Files.notExists(path)) { @@ -187,7 +187,7 @@ public Path findResource(String... path) { public void identifyLanguage() { this.loaders = this.modFileInfo.requiredLanguageLoaders().stream() - .map(spec-> FMLLoader.getLanguageLoadingProvider().findLanguage(this, spec.languageName(), spec.acceptedVersions())) + .map(spec -> FMLLoader.getLanguageLoadingProvider().findLanguage(this, spec.languageName(), spec.acceptedVersions())) .toList(); } @@ -216,8 +216,7 @@ public void setSecurityStatus(final SecureJar.Status status) { this.securityStatus = status; } - public ArtifactVersion getJarVersion() - { + public ArtifactVersion getJarVersion() { return new DefaultArtifactVersion(this.jarVersion); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileInfo.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileInfo.java index 0c283f317..f2f062e0b 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileInfo.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileInfo.java @@ -8,14 +8,6 @@ import com.google.common.base.Strings; import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.fml.loading.StringUtils; -import net.neoforged.neoforgespi.language.IConfigurable; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.language.MavenVersionAdapter; -import org.slf4j.Logger; -import javax.security.auth.x500.X500Principal; import java.net.URL; import java.security.CodeSigner; import java.security.InvalidKeyException; @@ -36,9 +28,16 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.security.auth.x500.X500Principal; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.fml.loading.StringUtils; +import net.neoforged.neoforgespi.language.IConfigurable; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.MavenVersionAdapter; +import org.slf4j.Logger; -public class ModFileInfo implements IModFileInfo, IConfigurable -{ +public class ModFileInfo implements IModFileInfo, IConfigurable { private static final Logger LOGGER = LogUtils.getLogger(); private final IConfigurable config; private final ModFile modFile; @@ -47,22 +46,21 @@ public class ModFileInfo implements IModFileInfo, IConfigurable private final boolean showAsResourcePack; private final boolean showAsDataPack; private final List mods; - private final Map properties; + private final Map properties; private final String license; private final List usesServices; - ModFileInfo(final ModFile modFile, final IConfigurable config, Consumer configFileConsumer) - { + ModFileInfo(final ModFile modFile, final IConfigurable config, Consumer configFileConsumer) { this.modFile = modFile; this.config = config; configFileConsumer.accept(this); // modloader is essential var modLoader = config.getConfigElement("modLoader") - .orElseThrow(()->new InvalidModFileException("Missing ModLoader in file", this)); + .orElseThrow(() -> new InvalidModFileException("Missing ModLoader in file", this)); // as is modloader version var modLoaderVersion = config.getConfigElement("loaderVersion") .map(MavenVersionAdapter::createFromVersionSpec) - .orElseThrow(()->new InvalidModFileException("Missing ModLoader version in file", this)); + .orElseThrow(() -> new InvalidModFileException("Missing ModLoader version in file", this)); this.languageSpecs = new ArrayList<>(List.of(new LanguageSpec(modLoader, modLoaderVersion))); // the remaining properties are optional with sensible defaults this.license = config.getConfigElement("license") @@ -80,15 +78,13 @@ public class ModFileInfo implements IModFileInfo, IConfigurable .map(StringUtils::toURL) .orElse(null); final List modConfigs = config.getConfigList("mods"); - if (modConfigs.isEmpty()) - { + if (modConfigs.isEmpty()) { throw new InvalidModFileException("Missing mods list", this); } this.mods = modConfigs.stream() - .map(mi-> (IModInfo)new ModInfo(this, mi)) + .map(mi -> (IModInfo) new ModInfo(this, mi)) .toList(); - if (LOGGER.isDebugEnabled(LogMarkers.LOADING)) - { + if (LOGGER.isDebugEnabled(LogMarkers.LOADING)) { LOGGER.debug(LogMarkers.LOADING, "Found valid mod file {} with {} mods - versions {}", this.modFile.getFileName(), this.mods.stream().map(IModInfo::getModId).collect(Collectors.joining(",", "{", "}")), @@ -102,13 +98,11 @@ public ModFileInfo(final ModFile file, final IConfigurable config, Consumer getMods() - { + public List getMods() { return mods; } - public ModFile getFile() - { + public ModFile getFile() { return this.modFile; } @@ -118,38 +112,32 @@ public List requiredLanguageLoaders() { } @Override - public Map getFileProperties() - { + public Map getFileProperties() { return this.properties; } @Override - public boolean showAsResourcePack() - { + public boolean showAsResourcePack() { return this.showAsResourcePack; } @Override - public boolean showAsDataPack() - { + public boolean showAsDataPack() { return this.showAsDataPack; } @Override - public Optional getConfigElement(final String... key) - { + public Optional getConfigElement(final String... key) { return this.config.getConfigElement(key); } @Override - public List getConfigList(final String... key) - { + public List getConfigList(final String... key) { return this.config.getConfigList(key); } @Override - public String getLicense() - { + public String getLicense() { return license; } @@ -158,48 +146,47 @@ public IConfigurable getConfig() { return this; } - public URL getIssueURL() - { + public URL getIssueURL() { return issueURL; } - public boolean missingLicense() - { + public boolean missingLicense() { return Strings.isNullOrEmpty(license); } public Optional getCodeSigningFingerprint() { var signers = this.modFile.getSecureJar().getManifestSigners(); return (signers == null ? Stream.of() : Arrays.stream(signers)) - .flatMap(csa->csa.getSignerCertPath().getCertificates().stream()) + .flatMap(csa -> csa.getSignerCertPath().getCertificates().stream()) .findFirst() .map(LambdaExceptionUtils.rethrowFunction(Certificate::getEncoded)) - .map(bytes->LambdaExceptionUtils.uncheck(()->MessageDigest.getInstance("SHA-256")).digest(bytes)) + .map(bytes -> LambdaExceptionUtils.uncheck(() -> MessageDigest.getInstance("SHA-256")).digest(bytes)) .map(StringUtils::binToHex) - .map(str-> String.join(":", str.split("(?<=\\G.{2})"))); + .map(str -> String.join(":", str.split("(?<=\\G.{2})"))); } public Optional getTrustData() { return Arrays.stream(this.modFile.getSecureJar().getManifestSigners()) - .flatMap(csa->csa.getSignerCertPath().getCertificates().stream()) + .flatMap(csa -> csa.getSignerCertPath().getCertificates().stream()) .findFirst() .map(X509Certificate.class::cast) - .map(c->{ + .map(c -> { StringBuffer sb = new StringBuffer(); sb.append(c.getSubjectX500Principal().getName(X500Principal.RFC2253).split(",")[0]); boolean selfSigned = false; - try { - c.verify(c.getPublicKey()); - selfSigned = true; - } catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | SignatureException | NoSuchProviderException e) { - // not self signed - } - if (selfSigned) { - sb.append(" self-signed"); - } else { - sb.append(" signed by ").append(c.getIssuerX500Principal().getName(X500Principal.RFC2253).split(",")[0]); - }; - return sb.toString(); + try { + c.verify(c.getPublicKey()); + selfSigned = true; + } catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | SignatureException | NoSuchProviderException e) { + // not self signed + } + if (selfSigned) { + sb.append(" self-signed"); + } else { + sb.append(" signed by ").append(c.getIssuerX500Principal().getName(X500Principal.RFC2253).split(",")[0]); + } + ; + return sb.toString(); }); } @@ -209,7 +196,7 @@ public String moduleName() { } @Override - public String versionString() { + public String versionString() { return getMods().get(0).getVersion().toString(); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index 0cc620e4e..8aeb46dbc 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -9,12 +9,6 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.language.IModFileInfo; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.ModFileFactory; -import org.slf4j.Logger; - import java.io.IOException; import java.lang.reflect.Type; import java.nio.file.Files; @@ -23,6 +17,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.language.IModFileInfo; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.ModFileFactory; +import org.slf4j.Logger; public class ModFileParser { private static final Logger LOGGER = LogUtils.getLogger(); @@ -33,7 +32,7 @@ public static IModFileInfo readModList(final ModFile modFile, final ModFileFacto public static IModFileInfo modsTomlParser(final IModFile imodFile) { ModFile modFile = (ModFile) imodFile; - LOGGER.debug(LogMarkers.LOADING,"Considering mod file candidate {}", modFile.getFilePath()); + LOGGER.debug(LogMarkers.LOADING, "Considering mod file candidate {}", modFile.getFilePath()); final Path modsjson = modFile.findResource(AbstractModProvider.MODS_TOML); if (!Files.exists(modsjson)) { LOGGER.warn(LogMarkers.LOADING, "Mod file {} is missing {} file", modFile.getFilePath(), AbstractModProvider.MODS_TOML); @@ -48,7 +47,7 @@ public static IModFileInfo modsTomlParser(final IModFile imodFile) { } protected static List getCoreMods(final ModFile modFile) { - Map coreModPaths; + Map coreModPaths; try { final Path coremodsjson = modFile.findResource("META-INF", "coremods.json"); if (!Files.exists(coremodsjson)) { @@ -58,13 +57,13 @@ protected static List getCoreMods(final ModFile modFile) { final Gson gson = new Gson(); coreModPaths = gson.fromJson(Files.newBufferedReader(coremodsjson), type); } catch (IOException e) { - LOGGER.debug(LogMarkers.LOADING,"Failed to read coremod list coremods.json", e); + LOGGER.debug(LogMarkers.LOADING, "Failed to read coremod list coremods.json", e); return Collections.emptyList(); } return coreModPaths.entrySet().stream() - .peek(e-> LOGGER.debug(LogMarkers.LOADING,"Found coremod {} with Javascript path {}", e.getKey(), e.getValue())) - .map(e -> new CoreModFile(e.getKey(), modFile.findResource(e.getValue()),modFile)) + .peek(e -> LOGGER.debug(LogMarkers.LOADING, "Found coremod {} with Javascript path {}", e.getKey(), e.getValue())) + .map(e -> new CoreModFile(e.getKey(), modFile.findResource(e.getValue()), modFile)) .toList(); } @@ -85,7 +84,6 @@ protected static List getMixinConfigs(IModFileInfo modFileInfo) { } } - protected static Optional> getAccessTransformers(IModFileInfo modFileInfo) { try { final var config = modFileInfo.getConfig(); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModInfo.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModInfo.java index f66ce7ff3..c23bce2ce 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModInfo.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModInfo.java @@ -6,6 +6,13 @@ package net.neoforged.fml.loading.moddiscovery; import com.mojang.logging.LogUtils; +import java.net.URL; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.fml.loading.StringSubstitutor; import net.neoforged.fml.loading.StringUtils; @@ -18,16 +25,7 @@ import org.apache.maven.artifact.versioning.VersionRange; import org.slf4j.Logger; -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; -import java.util.regex.Pattern; - -public class ModInfo implements IModInfo, IConfigurable -{ +public class ModInfo implements IModInfo, IConfigurable { private static final Logger LOGGER = LogUtils.getLogger(); private static final DefaultArtifactVersion DEFAULT_VERSION = new DefaultArtifactVersion("1"); private static final Pattern VALID_MODID = Pattern.compile("^[a-z][a-z0-9_]{1,63}$"); @@ -46,12 +44,11 @@ public class ModInfo implements IModInfo, IConfigurable private final List dependencies; private final List features; - private final Map properties; + private final Map properties; private final IConfigurable config; private final Optional modUrl; - public ModInfo(final ModFileInfo owningFile, final IConfigurable config) - { + public ModInfo(final ModFileInfo owningFile, final IConfigurable config) { Optional ownFile = Optional.ofNullable(owningFile); this.owningFile = owningFile; this.config = config; @@ -76,7 +73,7 @@ public ModInfo(final ModFileInfo owningFile, final IConfigurable config) .orElse(DEFAULT_VERSION); // verify we have a valid mod version if (!VALID_VERSION.matcher(this.version.toString()).matches()) { - throw new InvalidModFileException("Illegal version number specified "+this.version, this.getOwningFile()); + throw new InvalidModFileException("Illegal version number specified " + this.version, this.getOwningFile()); } // The remaining properties all default to sensible values and are not essential this.displayName = config.getConfigElement("displayName") @@ -103,7 +100,7 @@ public ModInfo(final ModFileInfo owningFile, final IConfigurable config) .toList(); this.features = ownFile.flatMap(mfi -> mfi.>getConfigElement("features", this.modId)) .stream() - .flatMap(m->m.entrySet().stream()) + .flatMap(m -> m.entrySet().stream()) .map(this::makeBound) .toList(); this.properties = ownFile.flatMap(mfi -> mfi.>getConfigElement("modproperties", this.modId)) @@ -121,14 +118,12 @@ public String getModId() { } @Override - public String getDisplayName() - { + public String getDisplayName() { return this.displayName; } @Override - public String getDescription() - { + public String getDescription() { return this.description; } @@ -158,14 +153,12 @@ public Optional getUpdateURL() { } @Override - public Optional getLogoFile() - { + public Optional getLogoFile() { return this.logoFile; } @Override - public boolean getLogoBlur() - { + public boolean getLogoBlur() { return this.logoBlur; } @@ -215,7 +208,7 @@ class ModVersion implements net.neoforged.neoforgespi.language.IModInfo.ModVersi public ModVersion(final IModInfo owner, final IConfigurable config) { this.owner = owner; this.modId = config.getConfigElement("modId") - .orElseThrow(()->new InvalidModFileException("Missing required field modid in dependency", getOwningFile())); + .orElseThrow(() -> new InvalidModFileException("Missing required field modid in dependency", getOwningFile())); this.type = config.getConfigElement("type") // TODO - 1.21: remove the fallback to the mandatory field .map(str -> str.toUpperCase(Locale.ROOT)).map(DependencyType::valueOf).orElseGet(() -> { @@ -248,16 +241,13 @@ public ModVersion(final IModInfo owner, final IConfigurable config) { .map(StringUtils::toURL); } - @Override - public String getModId() - { + public String getModId() { return modId; } @Override - public VersionRange getVersionRange() - { + public VersionRange getVersionRange() { return versionRange; } @@ -272,26 +262,22 @@ public Optional getReason() { } @Override - public Ordering getOrdering() - { + public Ordering getOrdering() { return ordering; } @Override - public DependencySide getSide() - { + public DependencySide getSide() { return side; } @Override - public void setOwner(final IModInfo owner) - { + public void setOwner(final IModInfo owner) { this.owner = owner; } @Override - public IModInfo getOwner() - { + public IModInfo getOwner() { return owner; } @@ -300,5 +286,4 @@ public Optional getReferralURL() { return referralUrl; } } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModJarMetadata.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModJarMetadata.java index 2eb443b15..094994ef1 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModJarMetadata.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModJarMetadata.java @@ -8,10 +8,9 @@ import cpw.mods.jarhandling.JarContents; import cpw.mods.jarhandling.JarMetadata; import cpw.mods.jarhandling.LazyJarMetadata; -import net.neoforged.neoforgespi.locating.IModFile; - import java.lang.module.ModuleDescriptor; import java.util.Objects; +import net.neoforged.neoforgespi.locating.IModFile; public final class ModJarMetadata extends LazyJarMetadata implements JarMetadata { private final JarContents jarContents; @@ -66,6 +65,6 @@ public int hashCode() { @Override public String toString() { - return "ModJarMetadata[" +"modFile=" + modFile + ']'; + return "ModJarMetadata[" + "modFile=" + modFile + ']'; } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModListHandler.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModListHandler.java index 974f3e983..7a8bc9be0 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModListHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModListHandler.java @@ -6,13 +6,6 @@ package net.neoforged.fml.loading.moddiscovery; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.loading.FileUtils; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.fml.loading.MavenCoordinateResolver; -import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -21,34 +14,32 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.fml.loading.FileUtils; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.fml.loading.MavenCoordinateResolver; +import org.apache.commons.lang3.tuple.Pair; +import org.slf4j.Logger; public class ModListHandler { private static final Logger LOGGER = LogUtils.getLogger(); + /** * Reads the modList paths specified, and searches each maven root for mods matching. Returns a list of mods * found. * - * @param modListPaths Paths to search for mod file lists + * @param modListPaths Paths to search for mod file lists * @param mavenRootPaths Roots to look for mods listed * @return list of found mod coordinates */ public static List processModLists(final List modListPaths, final List mavenRootPaths) { - final List modCoordinates = modListPaths.stream().map(ModListHandler::transformPathToList). - flatMap(Collection::stream). - collect(Collectors.toList()); + final List modCoordinates = modListPaths.stream().map(ModListHandler::transformPathToList).flatMap(Collection::stream).collect(Collectors.toList()); - List> localModCoords = modCoordinates.stream().map(mc->Pair.of(MavenCoordinateResolver.get(mc), mc)).collect(Collectors.toList()); - final List> foundCoordinates = localModCoords.stream(). - map(mc -> mavenRootPaths.stream(). - map(root -> Pair.of(root.resolve(mc.getLeft()), mc.getRight())). - filter(path -> Files.exists(path.getLeft())). - findFirst(). - orElseGet(()->{ - LOGGER.warn(LogMarkers.CORE, "Failed to find coordinate {}", mc); - return null; - })). - filter(Objects::nonNull). - collect(Collectors.toList()); + List> localModCoords = modCoordinates.stream().map(mc -> Pair.of(MavenCoordinateResolver.get(mc), mc)).collect(Collectors.toList()); + final List> foundCoordinates = localModCoords.stream().map(mc -> mavenRootPaths.stream().map(root -> Pair.of(root.resolve(mc.getLeft()), mc.getRight())).filter(path -> Files.exists(path.getLeft())).findFirst().orElseGet(() -> { + LOGGER.warn(LogMarkers.CORE, "Failed to find coordinate {}", mc); + return null; + })).filter(Objects::nonNull).collect(Collectors.toList()); final List found = foundCoordinates.stream().map(Pair::getRight).collect(Collectors.toList()); LOGGER.debug(LogMarkers.CORE, "Found mod coordinates from lists: {}", found); @@ -64,7 +55,7 @@ private static List transformPathToList(final String path) { } String extension = FileUtils.fileExtension(filePath); - if (Objects.equals("list",extension)) { + if (Objects.equals("list", extension)) { return readListFile(filePath).stream().filter(s -> !s.isEmpty()).collect(Collectors.toList()); } else { LOGGER.warn(LogMarkers.CORE, "Failed to read unknown file list type {} for file {}", extension, filePath); @@ -74,6 +65,7 @@ private static List transformPathToList(final String path) { /** * Simple list file, ending in ".list" with one mod coordinate per line + * * @param filePath path * @return list */ diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModMethodVisitor.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModMethodVisitor.java index 763a25c0e..135027284 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModMethodVisitor.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModMethodVisitor.java @@ -5,22 +5,19 @@ package net.neoforged.fml.loading.moddiscovery; +import java.lang.annotation.ElementType; +import java.util.LinkedList; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import java.lang.annotation.ElementType; -import java.util.LinkedList; - public class ModMethodVisitor extends MethodVisitor { - private final LinkedList annotations; private String methodName; private String methodDescriptor; - public ModMethodVisitor(String name, String desc, final LinkedList annotations) - { + public ModMethodVisitor(String name, String desc, final LinkedList annotations) { super(Opcodes.ASM9); this.methodName = name; this.methodDescriptor = desc; @@ -28,11 +25,9 @@ public ModMethodVisitor(String name, String desc, final LinkedList mf.getModInfos().size()).sum()); } - ImmediateWindowHandler.updateProgress("Found "+candidateMods.size()+" mod candidates"); + ImmediateWindowHandler.updateProgress("Found " + candidateMods.size() + " mod candidates"); } - @NotNull private List validateFiles(final List mods) { final List brokenFiles = new ArrayList<>(); - for (Iterator iterator = mods.iterator(); iterator.hasNext(); ) - { + for (Iterator iterator = mods.iterator(); iterator.hasNext();) { ModFile modFile = iterator.next(); if (!modFile.getProvider().isValid(modFile) || !modFile.identifyMods()) { LOGGER.warn(LogMarkers.SCAN, "File {} has been ignored - it is invalid", modFile.getFilePath()); @@ -82,7 +82,7 @@ public ITransformationService.Resource getModResources() { private List validateLanguages() { List errorData = new ArrayList<>(); - for (Iterator iterator = this.candidateMods.iterator(); iterator.hasNext(); ) { + for (Iterator iterator = this.candidateMods.iterator(); iterator.hasNext();) { final ModFile modFile = iterator.next(); try { modFile.identifyLanguage(); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModsFolderLocator.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModsFolderLocator.java index 327da710e..1a6c73e28 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModsFolderLocator.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModsFolderLocator.java @@ -7,23 +7,21 @@ import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.api.LambdaExceptionUtils; -import net.neoforged.fml.loading.FMLPaths; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.fml.loading.ModDirTransformerDiscoverer; -import net.neoforged.fml.loading.StringUtils; -import org.slf4j.Logger; - import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; import java.util.Map; import java.util.stream.Stream; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.fml.loading.ModDirTransformerDiscoverer; +import net.neoforged.fml.loading.StringUtils; +import org.slf4j.Logger; /** * Support loading mods located in JAR files in the mods folder */ -public class ModsFolderLocator extends AbstractJarFileModLocator -{ +public class ModsFolderLocator extends AbstractJarFileModLocator { private static final String SUFFIX = ".jar"; private static final Logger LOGGER = LogUtils.getLogger(); private final Path modFolder; @@ -44,12 +42,12 @@ public ModsFolderLocator() { @Override public Stream scanCandidates() { - LOGGER.debug(LogMarkers.SCAN,"Scanning mods dir {} for mods", this.modFolder); + LOGGER.debug(LogMarkers.SCAN, "Scanning mods dir {} for mods", this.modFolder); var excluded = ModDirTransformerDiscoverer.allExcluded(); - return LambdaExceptionUtils.uncheck(()-> Files.list(this.modFolder)) - .filter(p-> !excluded.contains(p) && StringUtils.toLowerCase(p.getFileName().toString()).endsWith(SUFFIX)) - .sorted(Comparator.comparing(path-> StringUtils.toLowerCase(path.getFileName().toString()))); + return LambdaExceptionUtils.uncheck(() -> Files.list(this.modFolder)) + .filter(p -> !excluded.contains(p) && StringUtils.toLowerCase(p.getFileName().toString()).endsWith(SUFFIX)) + .sorted(Comparator.comparing(path -> StringUtils.toLowerCase(path.getFileName().toString()))); } @Override @@ -59,10 +57,9 @@ public String name() { @Override public String toString() { - return "{"+customName+" locator at "+this.modFolder+"}"; + return "{" + customName + " locator at " + this.modFolder + "}"; } @Override - public void initArguments(final Map arguments) { - } + public void initArguments(final Map arguments) {} } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/NightConfigWrapper.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/NightConfigWrapper.java index 8acd96ab7..9936fa6d8 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/NightConfigWrapper.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/NightConfigWrapper.java @@ -5,17 +5,16 @@ package net.neoforged.fml.loading.moddiscovery; -import com.electronwill.nightconfig.core.UnmodifiableConfig; -import net.neoforged.neoforgespi.language.IConfigurable; -import net.neoforged.neoforgespi.language.IModFileInfo; +import static java.util.Arrays.asList; +import com.electronwill.nightconfig.core.UnmodifiableConfig; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; - -import static java.util.Arrays.asList; +import net.neoforged.neoforgespi.language.IConfigurable; +import net.neoforged.neoforgespi.language.IModFileInfo; public class NightConfigWrapper implements IConfigurable { private final UnmodifiableConfig config; @@ -48,12 +47,12 @@ public Optional getConfigElement(final String... key) { public List getConfigList(final String... key) { final List path = asList(key); if (this.config.contains(path) && !(this.config.get(path) instanceof Collection)) { - throw new InvalidModFileException("The configuration path "+path+" is invalid. Expecting a collection!", file); + throw new InvalidModFileException("The configuration path " + path + " is invalid. Expecting a collection!", file); } final Collection nestedConfigs = this.config.getOrElse(path, ArrayList::new); return nestedConfigs.stream() .map(NightConfigWrapper::new) - .map(cw->cw.setFile(file)) + .map(cw -> cw.setFile(file)) .collect(Collectors.toList()); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/Scanner.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/Scanner.java index 42b2dbe14..2bb056317 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/Scanner.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/Scanner.java @@ -6,17 +6,16 @@ package net.neoforged.fml.loading.moddiscovery; import com.mojang.logging.LogUtils; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.neoforgespi.language.IModLanguageProvider; -import net.neoforged.neoforgespi.language.ModFileScanData; -import org.objectweb.asm.ClassReader; -import org.slf4j.Logger; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import net.neoforged.fml.loading.LogMarkers; +import net.neoforged.neoforgespi.language.IModLanguageProvider; +import net.neoforged.neoforgespi.language.ModFileScanData; +import org.objectweb.asm.ClassReader; +import org.slf4j.Logger; public class Scanner { private static final Logger LOGGER = LogUtils.getLogger(); @@ -41,13 +40,13 @@ public ModFileScanData scan() { } private void fileVisitor(final Path path, final ModFileScanData result) { - try (InputStream in = Files.newInputStream(path)){ + try (InputStream in = Files.newInputStream(path)) { ModClassVisitor mcv = new ModClassVisitor(); ClassReader cr = new ClassReader(in); cr.accept(mcv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG); mcv.buildData(result.getClasses(), result.getAnnotations()); } catch (IOException | IllegalArgumentException e) { - LOGGER.error(LogMarkers.SCAN,"Exception scanning {} path {}", fileToScan, path, e); + LOGGER.error(LogMarkers.SCAN, "Exception scanning {} path {}", fileToScan, path, e); } } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/progress/Message.java b/loader/src/main/java/net/neoforged/fml/loading/progress/Message.java index 572c1508b..144ce3087 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/progress/Message.java +++ b/loader/src/main/java/net/neoforged/fml/loading/progress/Message.java @@ -41,7 +41,7 @@ enum MessageType { private final float[] colour; MessageType(final float r, final float g, final float b) { - colour = new float[] {r,g,b}; + colour = new float[] { r, g, b }; } public float[] colour() { diff --git a/loader/src/main/java/net/neoforged/fml/loading/progress/ProgressMeter.java b/loader/src/main/java/net/neoforged/fml/loading/progress/ProgressMeter.java index 96d57b086..40667bbf9 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/progress/ProgressMeter.java +++ b/loader/src/main/java/net/neoforged/fml/loading/progress/ProgressMeter.java @@ -45,7 +45,7 @@ public void complete() { } public float progress() { - return current.get()/(float)steps; + return current.get() / (float) steps; } public void setAbsolute(final int absolute) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/progress/StartupNotificationManager.java b/loader/src/main/java/net/neoforged/fml/loading/progress/StartupNotificationManager.java index f6f9d4e33..1c13f6f42 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/progress/StartupNotificationManager.java +++ b/loader/src/main/java/net/neoforged/fml/loading/progress/StartupNotificationManager.java @@ -7,8 +7,14 @@ import com.google.common.base.Ascii; import com.google.common.base.CharMatcher; - -import java.util.*; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.Deque; +import java.util.EnumMap; +import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public class StartupNotificationManager { @@ -29,6 +35,7 @@ public static ProgressMeter prependProgressBar(final String barName, final int c } return pm; } + public static ProgressMeter addProgressBar(final String barName, final int count) { var pm = new ProgressMeter(barName, count, 0, new Message(barName, Message.MessageType.ML)); synchronized (progressMeters) { @@ -44,6 +51,7 @@ public static void popBar(final ProgressMeter progressMeter) { } public record AgeMessage(int age, Message message) {} + public static List getMessages() { final long ts = System.nanoTime(); return messages.values().stream().flatMap(Collection::stream) @@ -53,19 +61,14 @@ public static List getMessages() { .toList(); } - private synchronized static void addMessage(Message.MessageType type, String message, int maxSize) - { + private synchronized static void addMessage(Message.MessageType type, String message, int maxSize) { EnumMap> newMessages = new EnumMap<>(messages); newMessages.compute(type, (key, existingList) -> { List newList = new ArrayList<>(); - if (existingList != null) - { - if (maxSize < 0) - { + if (existingList != null) { + if (maxSize < 0) { newList.addAll(existingList); - } - else - { + } else { newList.addAll(existingList.subList(0, Math.min(existingList.size(), maxSize))); } } @@ -76,12 +79,12 @@ private synchronized static void addMessage(Message.MessageType type, String mes } public static void addModMessage(final String message) { - final String safeMessage = Ascii.truncate(CharMatcher.ascii().retainFrom(message),80,"~"); + final String safeMessage = Ascii.truncate(CharMatcher.ascii().retainFrom(message), 80, "~"); addMessage(Message.MessageType.MOD, safeMessage, 20); } public static Optional> modLoaderConsumer() { - return Optional.of(s-> addMessage(Message.MessageType.ML, s, -1)); + return Optional.of(s -> addMessage(Message.MessageType.ML, s, -1)); } public static Optional> locatorConsumer() { @@ -89,6 +92,6 @@ public static Optional> locatorConsumer() { } public static Optional> mcLoaderConsumer() { - return Optional.of(s-> addMessage(Message.MessageType.MC, s, -1)); + return Optional.of(s -> addMessage(Message.MessageType.MC, s, -1)); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ArgumentList.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ArgumentList.java index f1fb00324..5779f7059 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ArgumentList.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ArgumentList.java @@ -6,14 +6,13 @@ package net.neoforged.fml.loading.targets; import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Supplier; +import org.slf4j.Logger; /* * A class that attempts to parse command line arguments into key value pairs to allow addition and editing. @@ -39,8 +38,8 @@ public static ArgumentList from(String... args) { String key = idx == -1 ? args[x] : args[x].substring(0, idx); String value = idx == -1 ? null : idx == args[x].length() - 1 ? "" : args[x].substring(idx + 1); - if (idx == -1 && x + 1 < args.length && !args[x+1].startsWith("-")) { //Not in --key=value, so try and grab the next argument. - ret.addArg(true, key, args[x+1]); //Assume that if the next value is a "argument" then don't use it as a value. + if (idx == -1 && x + 1 < args.length && !args[x + 1].startsWith("-")) { //Not in --key=value, so try and grab the next argument. + ret.addArg(true, key, args[x + 1]); //Assume that if the next value is a "argument" then don't use it as a value. x++; // This isn't perfect, but the best we can do without knowing all of the spec. } else { ret.addArg(false, key, value); @@ -74,8 +73,8 @@ public void addArg(boolean split, String raw, String value) { public String[] getArguments() { return entries.stream() - .flatMap(e -> Arrays.asList(e.get()).stream()) - .toArray(size -> new String[size]); + .flatMap(e -> Arrays.asList(e.get()).stream()) + .toArray(size -> new String[size]); } public boolean hasValue(String key) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonClientLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonClientLaunchHandler.java index 72f68044c..e065f4acd 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonClientLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonClientLaunchHandler.java @@ -5,19 +5,24 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.LibraryFinder; -import net.neoforged.fml.loading.VersionInfo; -import net.neoforged.api.distmarker.Dist; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.LibraryFinder; +import net.neoforged.fml.loading.VersionInfo; public abstract class CommonClientLaunchHandler extends CommonLaunchHandler { - @Override public Dist getDist() { return Dist.CLIENT; } + @Override + public Dist getDist() { + return Dist.CLIENT; + } - @Override public boolean isProduction() { return true; } + @Override + public boolean isProduction() { + return true; + } @Override protected void runService(String[] arguments, ModuleLayer gameLayer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonDevLaunchHandler.java index d2dfa1113..2bca63ba4 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonDevLaunchHandler.java @@ -8,9 +8,6 @@ import cpw.mods.jarhandling.JarContentsBuilder; import cpw.mods.jarhandling.SecureJar; import cpw.mods.niofs.union.UnionPathFilter; -import net.neoforged.fml.loading.FileUtils; -import net.neoforged.fml.loading.moddiscovery.AbstractModProvider; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -19,9 +16,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; +import net.neoforged.fml.loading.FileUtils; +import net.neoforged.fml.loading.moddiscovery.AbstractModProvider; public abstract class CommonDevLaunchHandler extends CommonLaunchHandler { - @Override public boolean isProduction() { return false; } + @Override + public boolean isProduction() { + return false; + } @Override public LocatedPaths getMinecraftPaths() { @@ -77,16 +79,16 @@ protected String[] preLaunch(String[] arguments, ModuleLayer layer) { return args.getArguments(); } - + protected static Optional searchJarOnClasspath(String[] classpath, String match) { return Arrays.stream(classpath) - .filter(e -> FileUtils.matchFileName(e, false, match)) - .findFirst().map(Paths::get); + .filter(e -> FileUtils.matchFileName(e, false, match)) + .findFirst().map(Paths::get); } protected static Path findJarOnClasspath(String[] classpath, String match) { return searchJarOnClasspath(classpath, match) - .orElseThrow(() -> new IllegalStateException("Could not find " + match + " in classpath")); + .orElseThrow(() -> new IllegalStateException("Could not find " + match + " in classpath")); } protected UnionPathFilter getMcFilter(Path extra, List minecraft, Stream.Builder> mods) { @@ -96,7 +98,8 @@ protected UnionPathFilter getMcFilter(Path extra, List minecraft, Stream.B // We serve everything, except for things in the forge packages. UnionPathFilter mcFilter = (path, base) -> { if (base.equals(extraPath) || - path.endsWith("/")) return true; + path.endsWith("/")) + return true; for (var pkg : packages) if (path.startsWith(pkg)) return false; return true; @@ -119,7 +122,7 @@ protected UnionPathFilter getMcFilter(Path extra, List minecraft, Stream.B } protected String[] getExcludedPrefixes() { - return new String[]{ "net/neoforged/neoforge/", "META-INF/services/", "META-INF/coremods.json", AbstractModProvider.MODS_TOML}; + return new String[] { "net/neoforged/neoforge/", "META-INF/services/", "META-INF/coremods.json", AbstractModProvider.MODS_TOML }; } private static String getRandomNumbers(int length) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonLaunchHandler.java index af9dd5dab..95067cfa6 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonLaunchHandler.java @@ -9,16 +9,6 @@ import cpw.mods.modlauncher.api.ILaunchHandlerService; import cpw.mods.modlauncher.api.ServiceRunner; import cpw.mods.niofs.union.UnionPathFilter; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.FileUtils; -import net.neoforged.fml.loading.LogMarkers; -import net.neoforged.api.distmarker.Dist; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.ConfigurationFactory; -import org.apache.logging.log4j.core.config.ConfigurationSource; -import org.apache.logging.log4j.core.config.Configurator; -import org.slf4j.Logger; - import java.io.File; import java.io.IOException; import java.net.URI; @@ -30,6 +20,15 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FileUtils; +import net.neoforged.fml.loading.LogMarkers; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.ConfigurationFactory; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.slf4j.Logger; public abstract class CommonLaunchHandler implements ILaunchHandlerService { public record LocatedPaths(List minecraftPaths, UnionPathFilter minecraftFilter, List> otherModPaths, List otherArtifacts) {} @@ -79,9 +78,9 @@ protected final String[] getLegacyClasspath() { protected final List getFmlPaths(String[] classpath) { String[] fmlLibraries = System.getProperty("fml.pluginLayerLibraries").split(","); return Arrays.stream(classpath) - .filter(e -> FileUtils.matchFileName(e, true, fmlLibraries)) - .map(Paths::get) - .toList(); + .filter(e -> FileUtils.matchFileName(e, true, fmlLibraries)) + .map(Paths::get) + .toList(); } public static Map> getModClasses() { @@ -125,6 +124,6 @@ protected void dataService(final String[] arguments, final ModuleLayer layer) th } protected void runTarget(final String target, final String[] arguments, final ModuleLayer layer) throws Throwable { - Class.forName(layer.findModule("minecraft").orElseThrow(),target).getMethod("main", String[].class).invoke(null, (Object)arguments); + Class.forName(layer.findModule("minecraft").orElseThrow(), target).getMethod("main", String[].class).invoke(null, (Object) arguments); } } diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonServerLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonServerLaunchHandler.java index 8d9537acc..5c9faffee 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonServerLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonServerLaunchHandler.java @@ -7,19 +7,24 @@ import cpw.mods.jarhandling.JarContentsBuilder; import cpw.mods.jarhandling.SecureJar; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.LibraryFinder; -import net.neoforged.fml.loading.VersionInfo; -import net.neoforged.api.distmarker.Dist; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.LibraryFinder; +import net.neoforged.fml.loading.VersionInfo; public abstract class CommonServerLaunchHandler extends CommonLaunchHandler { - @Override public Dist getDist() { return Dist.DEDICATED_SERVER; } + @Override + public Dist getDist() { + return Dist.DEDICATED_SERVER; + } - @Override public boolean isProduction() { return true; } + @Override + public boolean isProduction() { + return true; + } @Override protected void runService(String[] arguments, ModuleLayer gameLayer) throws Throwable { @@ -35,8 +40,8 @@ public LocatedPaths getMinecraftPaths() { // We only want it for its resources. So filter everything else out. .pathFilter((path, base) -> { return path.equals("META-INF/versions/") || // This is required because it bypasses our filter for the manifest, and it's a multi-release jar. - (!path.endsWith(".class") && - !path.startsWith("META-INF/")); + (!path.endsWith(".class") && + !path.startsWith("META-INF/")); }) .paths(mcextra) .build()); diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonUserdevLaunchHandler.java index 6f4aaae2e..da74c9bf2 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/CommonUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/CommonUserdevLaunchHandler.java @@ -5,15 +5,14 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.VersionInfo; - import java.io.File; import java.nio.file.Path; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.VersionInfo; public abstract class CommonUserdevLaunchHandler extends CommonDevLaunchHandler { @Override diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientDevLaunchHandler.java index c87a57d6c..6e4d380c8 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientDevLaunchHandler.java @@ -8,8 +8,15 @@ import net.neoforged.api.distmarker.Dist; public class FMLClientDevLaunchHandler extends CommonDevLaunchHandler { - @Override public String name() { return "fmlclientdev"; } - @Override public Dist getDist() { return Dist.CLIENT; } + @Override + public String name() { + return "fmlclientdev"; + } + + @Override + public Dist getDist() { + return Dist.CLIENT; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientLaunchHandler.java index 20cc4da21..01f91e7fe 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientLaunchHandler.java @@ -8,12 +8,14 @@ import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; - import net.neoforged.fml.loading.LibraryFinder; import net.neoforged.fml.loading.VersionInfo; public class FMLClientLaunchHandler extends CommonClientLaunchHandler { - @Override public String name() { return "fmlclient"; } + @Override + public String name() { + return "fmlclient"; + } @Override protected void processMCStream(VersionInfo versionInfo, Stream.Builder mc, Stream.Builder> mods) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientUserdevLaunchHandler.java index 807b41211..9ce4df395 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLClientUserdevLaunchHandler.java @@ -9,10 +9,14 @@ public class FMLClientUserdevLaunchHandler extends FMLUserdevLaunchHandler { @Override - public String name() { return "fmlclientuserdev"; } + public String name() { + return "fmlclientuserdev"; + } @Override - public Dist getDist() { return Dist.CLIENT; } + public Dist getDist() { + return Dist.CLIENT; + } @Override protected void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLDataUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLDataUserdevLaunchHandler.java index 60ad8d400..08719249a 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLDataUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLDataUserdevLaunchHandler.java @@ -9,13 +9,19 @@ public class FMLDataUserdevLaunchHandler extends FMLUserdevLaunchHandler { @Override - public String name() { return "fmldatauserdev"; } + public String name() { + return "fmldatauserdev"; + } @Override - public Dist getDist() { return Dist.CLIENT; } + public Dist getDist() { + return Dist.CLIENT; + } @Override - public boolean isData() { return true; } + public boolean isData() { + return true; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerDevLaunchHandler.java index acc8eced0..b71f105b2 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerDevLaunchHandler.java @@ -8,11 +8,18 @@ import net.neoforged.api.distmarker.Dist; public class FMLServerDevLaunchHandler extends CommonDevLaunchHandler { - @Override public String name() { return "fmlserverdev"; } - @Override public Dist getDist() { return Dist.DEDICATED_SERVER; } + @Override + public String name() { + return "fmlserverdev"; + } + + @Override + public Dist getDist() { + return Dist.DEDICATED_SERVER; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { serverService(arguments, layer); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerLaunchHandler.java index 512b1de25..35f711d48 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerLaunchHandler.java @@ -5,15 +5,17 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.LibraryFinder; -import net.neoforged.fml.loading.VersionInfo; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.LibraryFinder; +import net.neoforged.fml.loading.VersionInfo; public class FMLServerLaunchHandler extends CommonServerLaunchHandler { - @Override public String name() { return "fmlserver"; } + @Override + public String name() { + return "fmlserver"; + } @Override protected void processMCStream(VersionInfo versionInfo, Stream.Builder mc, Stream.Builder> mods) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerUserdevLaunchHandler.java index 03e91d56d..fef7b4c7c 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLServerUserdevLaunchHandler.java @@ -8,11 +8,18 @@ import net.neoforged.api.distmarker.Dist; public class FMLServerUserdevLaunchHandler extends FMLUserdevLaunchHandler { - @Override public String name() { return "fmlserveruserdev"; } - @Override public Dist getDist() { return Dist.DEDICATED_SERVER; } + @Override + public String name() { + return "fmlserveruserdev"; + } + + @Override + public Dist getDist() { + return Dist.DEDICATED_SERVER; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { serverService(arguments, layer); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLUserdevLaunchHandler.java index 2c8eda7e9..f673ea467 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/FMLUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/FMLUserdevLaunchHandler.java @@ -5,11 +5,10 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.VersionInfo; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.VersionInfo; public abstract class FMLUserdevLaunchHandler extends CommonUserdevLaunchHandler { @Override diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientDevLaunchHandler.java index 5b34360b3..81a28e4a5 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientDevLaunchHandler.java @@ -8,8 +8,15 @@ import net.neoforged.api.distmarker.Dist; public class ForgeClientDevLaunchHandler extends CommonDevLaunchHandler { - @Override public String name() { return "forgeclientdev"; } - @Override public Dist getDist() { return Dist.CLIENT; } + @Override + public String name() { + return "forgeclientdev"; + } + + @Override + public Dist getDist() { + return Dist.CLIENT; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientLaunchHandler.java index 0d8f310bd..a76f42146 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientLaunchHandler.java @@ -8,12 +8,14 @@ import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; - import net.neoforged.fml.loading.LibraryFinder; import net.neoforged.fml.loading.VersionInfo; public class ForgeClientLaunchHandler extends CommonClientLaunchHandler { - @Override public String name() { return "forgeclient"; } + @Override + public String name() { + return "forgeclient"; + } @Override protected void processMCStream(VersionInfo versionInfo, Stream.Builder mc, Stream.Builder> mods) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientUserdevLaunchHandler.java index 2bf39a822..325db7ff7 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeClientUserdevLaunchHandler.java @@ -9,10 +9,14 @@ public class ForgeClientUserdevLaunchHandler extends ForgeUserdevLaunchHandler { @Override - public String name() { return "forgeclientuserdev"; } + public String name() { + return "forgeclientuserdev"; + } @Override - public Dist getDist() { return Dist.CLIENT; } + public Dist getDist() { + return Dist.CLIENT; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataDevLaunchHandler.java index 6e4ee4fd2..f64f1c6f5 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataDevLaunchHandler.java @@ -8,9 +8,20 @@ import net.neoforged.api.distmarker.Dist; public class ForgeDataDevLaunchHandler extends CommonDevLaunchHandler { - @Override public String name() { return "forgedatadev"; } - @Override public Dist getDist() { return Dist.CLIENT; } - @Override public boolean isData() { return true; } + @Override + public String name() { + return "forgedatadev"; + } + + @Override + public Dist getDist() { + return Dist.CLIENT; + } + + @Override + public boolean isData() { + return true; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataUserdevLaunchHandler.java index e32c04eeb..5a64278d7 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeDataUserdevLaunchHandler.java @@ -9,13 +9,19 @@ public class ForgeDataUserdevLaunchHandler extends ForgeUserdevLaunchHandler { @Override - public String name() { return "forgedatauserdev"; } + public String name() { + return "forgedatauserdev"; + } @Override - public Dist getDist() { return Dist.CLIENT; } + public Dist getDist() { + return Dist.CLIENT; + } @Override - public boolean isData() { return true; } + public boolean isData() { + return true; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerDevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerDevLaunchHandler.java index ec65ce60c..b8c5c0ab6 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerDevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerDevLaunchHandler.java @@ -8,11 +8,18 @@ import net.neoforged.api.distmarker.Dist; public class ForgeServerDevLaunchHandler extends CommonDevLaunchHandler { - @Override public String name() { return "forgeserverdev"; } - @Override public Dist getDist() { return Dist.DEDICATED_SERVER; } + @Override + public String name() { + return "forgeserverdev"; + } + + @Override + public Dist getDist() { + return Dist.DEDICATED_SERVER; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { serverService(arguments, layer); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerLaunchHandler.java index f3599b880..3b95aee36 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerLaunchHandler.java @@ -5,15 +5,17 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.LibraryFinder; -import net.neoforged.fml.loading.VersionInfo; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.LibraryFinder; +import net.neoforged.fml.loading.VersionInfo; public class ForgeServerLaunchHandler extends CommonServerLaunchHandler { - @Override public String name() { return "forgeserver"; } + @Override + public String name() { + return "forgeserver"; + } @Override protected void processMCStream(VersionInfo versionInfo, Stream.Builder mc, Stream.Builder> mods) { diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerUserdevLaunchHandler.java index df0faf7a7..f43cf86f0 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeServerUserdevLaunchHandler.java @@ -8,11 +8,18 @@ import net.neoforged.api.distmarker.Dist; public class ForgeServerUserdevLaunchHandler extends ForgeUserdevLaunchHandler { - @Override public String name() { return "forgeserveruserdev"; } - @Override public Dist getDist() { return Dist.DEDICATED_SERVER; } + @Override + public String name() { + return "forgeserveruserdev"; + } + + @Override + public Dist getDist() { + return Dist.DEDICATED_SERVER; + } @Override public void runService(String[] arguments, ModuleLayer layer) throws Throwable { serverService(arguments, layer); } -} \ No newline at end of file +} diff --git a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeUserdevLaunchHandler.java b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeUserdevLaunchHandler.java index 6a6c4ebe7..f9584a351 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeUserdevLaunchHandler.java +++ b/loader/src/main/java/net/neoforged/fml/loading/targets/ForgeUserdevLaunchHandler.java @@ -5,11 +5,10 @@ package net.neoforged.fml.loading.targets; -import net.neoforged.fml.loading.VersionInfo; - import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import net.neoforged.fml.loading.VersionInfo; public abstract class ForgeUserdevLaunchHandler extends CommonUserdevLaunchHandler { @Override diff --git a/loader/src/main/java/net/neoforged/fml/loading/toposort/StronglyConnectedComponentDetector.java b/loader/src/main/java/net/neoforged/fml/loading/toposort/StronglyConnectedComponentDetector.java index e78399c70..b663f55bc 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/toposort/StronglyConnectedComponentDetector.java +++ b/loader/src/main/java/net/neoforged/fml/loading/toposort/StronglyConnectedComponentDetector.java @@ -6,7 +6,6 @@ package net.neoforged.fml.loading.toposort; import com.google.common.graph.Graph; - import java.util.BitSet; import java.util.HashMap; import java.util.HashSet; @@ -105,5 +104,4 @@ private void dfs(int now, int depth) { components.add(component); } } - } diff --git a/loader/src/main/java/net/neoforged/fml/loading/toposort/TopologicalSort.java b/loader/src/main/java/net/neoforged/fml/loading/toposort/TopologicalSort.java index 8713d6e4a..329c88769 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/toposort/TopologicalSort.java +++ b/loader/src/main/java/net/neoforged/fml/loading/toposort/TopologicalSort.java @@ -7,8 +7,6 @@ import com.google.common.base.Preconditions; import com.google.common.graph.Graph; -import org.jetbrains.annotations.Nullable; - import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Comparator; @@ -19,6 +17,7 @@ import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; +import org.jetbrains.annotations.Nullable; /** * Provides a topological sort algorithm. @@ -28,7 +27,6 @@ * for renderers, and even mod module loading. */ public final class TopologicalSort { - /** * A breath-first-search based topological sort. * diff --git a/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModContainer.java b/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModContainer.java index 3ea8d3555..233e788f3 100644 --- a/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModContainer.java +++ b/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModContainer.java @@ -5,6 +5,8 @@ package net.neoforged.fml.lowcodemod; +import static net.neoforged.fml.loading.LogMarkers.LOADING; + import com.mojang.logging.LogUtils; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; @@ -13,16 +15,12 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; -import static net.neoforged.fml.loading.LogMarkers.LOADING; - -public class LowCodeModContainer extends ModContainer -{ +public class LowCodeModContainer extends ModContainer { private static final Logger LOGGER = LogUtils.getLogger(); private final ModFileScanData scanResults; private Object modInstance; - public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer) - { + public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer) { super(info); LOGGER.debug(LOADING, "Creating LowCodeModContainer for {}", info.getModId()); this.scanResults = modFileScanResults; @@ -31,14 +29,12 @@ public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, Mo } @Override - public boolean matches(Object mod) - { + public boolean matches(Object mod) { return mod == modInstance; } @Override - public Object getMod() - { + public Object getMod() { return modInstance; } diff --git a/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModLanguageProvider.java b/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModLanguageProvider.java index 1c9353c45..822c2e731 100644 --- a/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModLanguageProvider.java +++ b/loader/src/main/java/net/neoforged/fml/lowcodemod/LowCodeModLanguageProvider.java @@ -5,43 +5,36 @@ package net.neoforged.fml.lowcodemod; -import net.neoforged.neoforgespi.language.IModLanguageProvider; -import net.neoforged.neoforgespi.language.IModInfo; -import net.neoforged.neoforgespi.language.ModFileScanData; - import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.IModLanguageProvider; +import net.neoforged.neoforgespi.language.ModFileScanData; -public class LowCodeModLanguageProvider implements IModLanguageProvider -{ - private record LowCodeModTarget(String modId) implements IModLanguageProvider.IModLanguageLoader - { +public class LowCodeModLanguageProvider implements IModLanguageProvider { + private record LowCodeModTarget(String modId) implements IModLanguageProvider.IModLanguageLoader { @SuppressWarnings("unchecked") @Override - public T loadMod(final IModInfo info, final ModFileScanData modFileScanResults, ModuleLayer gameLayer) - { + public T loadMod(final IModInfo info, final ModFileScanData modFileScanResults, ModuleLayer gameLayer) { return (T) new LowCodeModContainer(info, modFileScanResults, gameLayer); } } @Override - public String name() - { + public String name() { return "lowcodefml"; } @Override - public Consumer getFileVisitor() - { - return scanResult -> - { + public Consumer getFileVisitor() { + return scanResult -> { final Map modTargetMap = scanResult.getIModInfoData().stream() - .flatMap(fi->fi.getMods().stream()) + .flatMap(fi -> fi.getMods().stream()) .map(IModInfo::getModId) .map(LowCodeModTarget::new) - .collect(Collectors.toMap(LowCodeModTarget::modId, Function.identity(), (a, b)->a)); + .collect(Collectors.toMap(LowCodeModTarget::modId, Function.identity(), (a, b) -> a)); scanResult.addLanguageLoader(modTargetMap); }; } diff --git a/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModContainer.java b/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModContainer.java index 9f0cc0a5d..e912be4ad 100644 --- a/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModContainer.java +++ b/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModContainer.java @@ -5,13 +5,12 @@ package net.neoforged.fml.mclanguageprovider; +import java.util.Objects; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.neoforgespi.language.IModInfo; import org.jetbrains.annotations.Nullable; -import java.util.Objects; - public class MinecraftModContainer extends ModContainer { private static final String MCMODINSTANCE = "minecraft, the mod"; diff --git a/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModLanguageProvider.java b/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModLanguageProvider.java index f691e96ee..966090d85 100644 --- a/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModLanguageProvider.java +++ b/loader/src/main/java/net/neoforged/fml/mclanguageprovider/MinecraftModLanguageProvider.java @@ -5,13 +5,12 @@ package net.neoforged.fml.mclanguageprovider; +import java.util.Map; +import java.util.function.Consumer; import net.neoforged.neoforgespi.language.IModInfo; import net.neoforged.neoforgespi.language.IModLanguageProvider; import net.neoforged.neoforgespi.language.ModFileScanData; -import java.util.Map; -import java.util.function.Consumer; - public class MinecraftModLanguageProvider implements IModLanguageProvider { @Override public String name() { @@ -20,7 +19,7 @@ public String name() { @Override public Consumer getFileVisitor() { - return (sd)->sd.addLanguageLoader(Map.of("minecraft", new MinecraftModTarget())); + return (sd) -> sd.addLanguageLoader(Map.of("minecraft", new MinecraftModTarget())); } public static class MinecraftModTarget implements IModLanguageLoader { diff --git a/loader/src/main/java/net/neoforged/fml/util/CertificateHelper.java b/loader/src/main/java/net/neoforged/fml/util/CertificateHelper.java index 96f3fa110..8bacb347e 100644 --- a/loader/src/main/java/net/neoforged/fml/util/CertificateHelper.java +++ b/loader/src/main/java/net/neoforged/fml/util/CertificateHelper.java @@ -6,73 +6,57 @@ package net.neoforged.fml.util; import com.google.common.collect.ImmutableList; - import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.cert.Certificate; public class CertificateHelper { - private static final String HEXES = "0123456789abcdef"; - public static ImmutableList getFingerprints(Certificate[] certificates) - { + public static ImmutableList getFingerprints(Certificate[] certificates) { int len = 0; - if (certificates != null) - { + if (certificates != null) { len = certificates.length; } ImmutableList.Builder certBuilder = ImmutableList.builder(); - for (int i = 0; i < len; i++) - { + for (int i = 0; i < len; i++) { certBuilder.add(CertificateHelper.getFingerprint(certificates[i])); } return certBuilder.build(); } - public static String getFingerprint(Certificate certificate) - { - if (certificate == null) - { + public static String getFingerprint(Certificate certificate) { + if (certificate == null) { return "NO VALID CERTIFICATE FOUND"; } - try - { + try { MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] der = certificate.getEncoded(); md.update(der); byte[] digest = md.digest(); return hexify(digest); - } - catch (Exception e) - { + } catch (Exception e) { return "CERTIFICATE FINGERPRINT EXCEPTION"; } } - public static String getFingerprint(ByteBuffer buffer) - { - try - { + public static String getFingerprint(ByteBuffer buffer) { + try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(buffer); byte[] chksum = digest.digest(); return hexify(chksum); - } - catch (Exception e) - { + } catch (Exception e) { return "CERTIFICATE FINGERPRINT EXCEPTION"; } } - private static String hexify(byte[] chksum) - { - final StringBuilder hex = new StringBuilder( 2 * chksum.length ); - for ( final byte b : chksum ) { - hex.append(HEXES.charAt((b & 0xF0) >> 4)) - .append(HEXES.charAt((b & 0x0F))); + private static String hexify(byte[] chksum) { + final StringBuilder hex = new StringBuilder(2 * chksum.length); + for (final byte b : chksum) { + hex.append(HEXES.charAt((b & 0xF0) >> 4)) + .append(HEXES.charAt((b & 0x0F))); } return hex.toString(); } - } diff --git a/loader/src/main/java/net/neoforged/fml/util/EnhancedRuntimeException.java b/loader/src/main/java/net/neoforged/fml/util/EnhancedRuntimeException.java index 7cca5efa8..57814c443 100644 --- a/loader/src/main/java/net/neoforged/fml/util/EnhancedRuntimeException.java +++ b/loader/src/main/java/net/neoforged/fml/util/EnhancedRuntimeException.java @@ -13,21 +13,29 @@ * RuntimeException that gives subclasses the simple opportunity to write extra data when printing the stack trace. * Mainly a helper class as printsStackTrace has multiple signatures. */ -public abstract class EnhancedRuntimeException extends RuntimeException -{ +public abstract class EnhancedRuntimeException extends RuntimeException { private static final long serialVersionUID = 1L; - public EnhancedRuntimeException() { super(); } - public EnhancedRuntimeException(String message) { super(message); } - public EnhancedRuntimeException(String message, Throwable cause) { super(message, cause); } - public EnhancedRuntimeException(Throwable cause) { super(cause); } + public EnhancedRuntimeException() { + super(); + } + + public EnhancedRuntimeException(String message) { + super(message); + } + + public EnhancedRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public EnhancedRuntimeException(Throwable cause) { + super(cause); + } @Override - public String getMessage() - { + public String getMessage() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); - if (stack.length > 2 && stack[2].getClassName().startsWith("org.apache.logging.log4j.")) - { + if (stack.length > 2 && stack[2].getClassName().startsWith("org.apache.logging.log4j.")) { // This is a bit of a hack to force ourselves to be able to give a extended description when log4j prints this out. // Sadly this text is displayed AFTER the initial exception line, and before the stack trace. But as the intention // is to print this to the end user this is what we need to do. @@ -38,11 +46,9 @@ public String getMessage() buf.append(msg); buf.append('\n'); - this.printStackTrace(new WrappedPrintStream() - { + this.printStackTrace(new WrappedPrintStream() { @Override - public void println(String line) - { + public void println(String line) { buf.append(line).append('\n'); } }); @@ -52,26 +58,21 @@ public void println(String line) } @Override - public void printStackTrace(final PrintWriter s) - { - printStackTrace(new WrappedPrintStream() - { + public void printStackTrace(final PrintWriter s) { + printStackTrace(new WrappedPrintStream() { @Override - public void println(String line) - { + public void println(String line) { s.println(line); } }); super.printStackTrace(s); } + @Override - public void printStackTrace(final PrintStream s) - { - printStackTrace(new WrappedPrintStream() - { + public void printStackTrace(final PrintStream s) { + printStackTrace(new WrappedPrintStream() { @Override - public void println(String line) - { + public void println(String line) { s.println(line); } }); @@ -80,8 +81,7 @@ public void println(String line) protected abstract void printStackTrace(WrappedPrintStream stream); - public static abstract class WrappedPrintStream - { + public static abstract class WrappedPrintStream { public abstract void println(String line); } } diff --git a/loader/src/main/java/net/neoforged/fml/util/LoaderException.java b/loader/src/main/java/net/neoforged/fml/util/LoaderException.java index cecc279d4..0ab9c283d 100644 --- a/loader/src/main/java/net/neoforged/fml/util/LoaderException.java +++ b/loader/src/main/java/net/neoforged/fml/util/LoaderException.java @@ -5,30 +5,26 @@ package net.neoforged.fml.util; - -public class LoaderException extends EnhancedRuntimeException -{ +public class LoaderException extends EnhancedRuntimeException { /** * */ private static final long serialVersionUID = -5675297950958861378L; - public LoaderException(Throwable wrapped) - { + public LoaderException(Throwable wrapped) { super(wrapped); } - public LoaderException() - { - } - public LoaderException(String message) - { + public LoaderException() {} + + public LoaderException(String message) { super(message); } - public LoaderException(String message, Throwable cause) - { + + public LoaderException(String message, Throwable cause) { super(message, cause); } - @Override protected void printStackTrace(WrappedPrintStream stream){} + @Override + protected void printStackTrace(WrappedPrintStream stream) {} } diff --git a/loader/src/main/java/net/neoforged/fml/util/LoaderExceptionModCrash.java b/loader/src/main/java/net/neoforged/fml/util/LoaderExceptionModCrash.java index ad5c0b906..79897f1c8 100644 --- a/loader/src/main/java/net/neoforged/fml/util/LoaderExceptionModCrash.java +++ b/loader/src/main/java/net/neoforged/fml/util/LoaderExceptionModCrash.java @@ -8,18 +8,15 @@ /** * Prevent LoaderException from adding its own stack trace to the wrapped throwable's stack trace. */ -public class LoaderExceptionModCrash extends LoaderException -{ +public class LoaderExceptionModCrash extends LoaderException { private static final long serialVersionUID = 1L; - public LoaderExceptionModCrash(String message, Throwable cause) - { + public LoaderExceptionModCrash(String message, Throwable cause) { super(message, cause); } @Override - public synchronized Throwable fillInStackTrace() - { + public synchronized Throwable fillInStackTrace() { return this; } } diff --git a/loader/src/main/java/net/neoforged/fml/util/ObfuscationReflectionHelper.java b/loader/src/main/java/net/neoforged/fml/util/ObfuscationReflectionHelper.java index 15b666735..8222b19e1 100644 --- a/loader/src/main/java/net/neoforged/fml/util/ObfuscationReflectionHelper.java +++ b/loader/src/main/java/net/neoforged/fml/util/ObfuscationReflectionHelper.java @@ -4,19 +4,16 @@ */ package net.neoforged.fml.util; + +import com.google.common.base.Preconditions; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.StringJoiner; - -import net.neoforged.fml.loading.FMLLoader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; - -import com.google.common.base.Preconditions; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -30,9 +27,8 @@ * All field and method names should be passed in as SRG names, and this will automatically resolve if MCP mappings are detected. * */ -@SuppressWarnings({"serial", "unchecked", "unused", "WeakerAccess"}) -public class ObfuscationReflectionHelper -{ +@SuppressWarnings({ "serial", "unchecked", "unused", "WeakerAccess" }) +public class ObfuscationReflectionHelper { private static final Logger LOGGER = LogManager.getLogger(); private static final Marker REFLECTION = MarkerManager.getMarker("REFLECTION"); @@ -52,20 +48,14 @@ public class ObfuscationReflectionHelper * @throws UnableToAccessFieldException If there was a problem getting the value. */ @Nullable - public static T getPrivateValue(Class classToAccess, E instance, String fieldName) - { - try - { + public static T getPrivateValue(Class classToAccess, E instance, String fieldName) { + try { return (T) findField(classToAccess, fieldName).get(instance); - } - catch (UnableToFindFieldException e) - { - LOGGER.error(REFLECTION,"Unable to locate field {} ({}) on type {}", fieldName, fieldName, classToAccess.getName(), e); + } catch (UnableToFindFieldException e) { + LOGGER.error(REFLECTION, "Unable to locate field {} ({}) on type {}", fieldName, fieldName, classToAccess.getName(), e); throw e; - } - catch (IllegalAccessException e) - { - LOGGER.error(REFLECTION,"Unable to access field {} ({}) on type {}", fieldName, fieldName, classToAccess.getName(), e); + } catch (IllegalAccessException e) { + LOGGER.error(REFLECTION, "Unable to access field {} ({}) on type {}", fieldName, fieldName, classToAccess.getName(), e); throw new UnableToAccessFieldException(e); } } @@ -85,19 +75,13 @@ public static T getPrivateValue(Class classToAccess, E instanc * @throws UnableToFindFieldException If there was a problem getting the field. * @throws UnableToAccessFieldException If there was a problem setting the value of the field. */ - public static void setPrivateValue(@NotNull final Class classToAccess, @NotNull final T instance, @Nullable final E value, @NotNull final String fieldName) - { - try - { + public static void setPrivateValue(final Class classToAccess, final T instance, @Nullable final E value, final String fieldName) { + try { findField(classToAccess, fieldName).set(instance, value); - } - catch (UnableToFindFieldException e) - { + } catch (UnableToFindFieldException e) { LOGGER.error("Unable to locate any field {} on type {}", fieldName, classToAccess.getName(), e); throw e; - } - catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { LOGGER.error("Unable to set any field {} on type {}", fieldName, classToAccess.getName(), e); throw new UnableToAccessFieldException(e); } @@ -119,22 +103,17 @@ public static void setPrivateValue(@NotNull final Class classT * @throws NullPointerException If {@code parameterTypes} is null. * @throws UnableToFindMethodException If the method could not be found. */ - @NotNull - public static Method findMethod(@NotNull final Class clazz, @NotNull final String methodName, @NotNull final Class... parameterTypes) - { + public static Method findMethod(final Class clazz, final String methodName, final Class... parameterTypes) { Preconditions.checkNotNull(clazz, "Class to find method on cannot be null."); Preconditions.checkNotNull(methodName, "Name of method to find cannot be null."); Preconditions.checkArgument(!methodName.isEmpty(), "Name of method to find cannot be empty."); Preconditions.checkNotNull(parameterTypes, "Parameter types of method to find cannot be null."); - try - { + try { Method m = clazz.getDeclaredMethod(methodName, parameterTypes); m.setAccessible(true); return m; - } - catch (Exception e) - { + } catch (Exception e) { throw new UnableToFindMethodException(e); } } @@ -153,26 +132,20 @@ public static Method findMethod(@NotNull final Class clazz, @NotNull final St * @throws NullPointerException If {@code parameterTypes} is null. * @throws UnknownConstructorException If the constructor could not be found. */ - @NotNull - public static Constructor findConstructor(@NotNull final Class clazz, @NotNull final Class... parameterTypes) - { + public static Constructor findConstructor(final Class clazz, final Class... parameterTypes) { Preconditions.checkNotNull(clazz, "Class to find constructor on cannot be null."); Preconditions.checkNotNull(parameterTypes, "Parameter types of constructor to find cannot be null."); - try - { + try { Constructor constructor = clazz.getDeclaredConstructor(parameterTypes); constructor.setAccessible(true); return constructor; - } - catch (final NoSuchMethodException e) - { + } catch (final NoSuchMethodException e) { final StringBuilder desc = new StringBuilder(); desc.append(clazz.getSimpleName()); StringJoiner joiner = new StringJoiner(", ", "(", ")"); - for (Class type : parameterTypes) - { + for (Class type : parameterTypes) { joiner.add(type.getSimpleName()); } desc.append(joiner); @@ -196,53 +169,40 @@ public static Constructor findConstructor(@NotNull final Class clazz, * @throws IllegalArgumentException If {@code fieldName} is empty. * @throws UnableToFindFieldException If the field could not be found. */ - @NotNull - public static Field findField(@NotNull final Class clazz, @NotNull final String fieldName) - { + public static Field findField(final Class clazz, final String fieldName) { Preconditions.checkNotNull(clazz, "Class to find field on cannot be null."); Preconditions.checkNotNull(fieldName, "Name of field to find cannot be null."); Preconditions.checkArgument(!fieldName.isEmpty(), "Name of field to find cannot be empty."); - try - { + try { Field f = clazz.getDeclaredField(fieldName); f.setAccessible(true); return f; - } - catch (Exception e) - { + } catch (Exception e) { throw new UnableToFindFieldException(e); } } - public static class UnableToAccessFieldException extends RuntimeException - { - private UnableToAccessFieldException(Exception e) - { + public static class UnableToAccessFieldException extends RuntimeException { + private UnableToAccessFieldException(Exception e) { super(e); } } - public static class UnableToFindFieldException extends RuntimeException - { - private UnableToFindFieldException(Exception e) - { + public static class UnableToFindFieldException extends RuntimeException { + private UnableToFindFieldException(Exception e) { super(e); } } - public static class UnableToFindMethodException extends RuntimeException - { - public UnableToFindMethodException(Throwable failed) - { + public static class UnableToFindMethodException extends RuntimeException { + public UnableToFindMethodException(Throwable failed) { super(failed); } } - public static class UnknownConstructorException extends RuntimeException - { - public UnknownConstructorException(final String message) - { + public static class UnknownConstructorException extends RuntimeException { + public UnknownConstructorException(final String message) { super(message); } } diff --git a/loader/src/main/java/net/neoforged/fml/util/thread/EffectiveSide.java b/loader/src/main/java/net/neoforged/fml/util/thread/EffectiveSide.java index 256f849fc..dbe070e5e 100644 --- a/loader/src/main/java/net/neoforged/fml/util/thread/EffectiveSide.java +++ b/loader/src/main/java/net/neoforged/fml/util/thread/EffectiveSide.java @@ -7,8 +7,7 @@ import net.neoforged.fml.LogicalSide; -public class EffectiveSide -{ +public class EffectiveSide { public static LogicalSide get() { final ThreadGroup group = Thread.currentThread().getThreadGroup(); return group instanceof SidedThreadGroup ? ((SidedThreadGroup) group).getSide() : LogicalSide.CLIENT; diff --git a/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroup.java b/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroup.java index e4218b85b..c419fb9d0 100644 --- a/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroup.java +++ b/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroup.java @@ -5,20 +5,16 @@ package net.neoforged.fml.util.thread; -import net.neoforged.fml.LogicalSide; -import org.jetbrains.annotations.NotNull; - import java.util.concurrent.ThreadFactory; +import net.neoforged.fml.LogicalSide; /** * A thread group and factory combination which belongs to a {@link LogicalSide}. */ -public final class SidedThreadGroup extends ThreadGroup implements ThreadFactory -{ +public final class SidedThreadGroup extends ThreadGroup implements ThreadFactory { private final LogicalSide side; - SidedThreadGroup(final LogicalSide side) - { + SidedThreadGroup(final LogicalSide side) { super(side.name()); this.side = side; } @@ -28,14 +24,12 @@ public final class SidedThreadGroup extends ThreadGroup implements ThreadFactory * * @return the side */ - public LogicalSide getSide() - { + public LogicalSide getSide() { return this.side; } @Override - public Thread newThread(@NotNull final Runnable runnable) - { + public Thread newThread(final Runnable runnable) { return new Thread(this, runnable); } } diff --git a/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroups.java b/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroups.java index a47a544f9..6347d74c7 100644 --- a/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroups.java +++ b/loader/src/main/java/net/neoforged/fml/util/thread/SidedThreadGroups.java @@ -7,11 +7,9 @@ import net.neoforged.fml.LogicalSide; -public final class SidedThreadGroups -{ +public final class SidedThreadGroups { public static final SidedThreadGroup CLIENT = new SidedThreadGroup(LogicalSide.CLIENT); public static final SidedThreadGroup SERVER = new SidedThreadGroup(LogicalSide.SERVER); - private SidedThreadGroups() { - } + private SidedThreadGroups() {} } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/Environment.java b/spi/src/main/java/net/neoforged/neoforgespi/Environment.java index 81c455467..4d277f396 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/Environment.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/Environment.java @@ -8,16 +8,15 @@ import cpw.mods.modlauncher.api.IEnvironment; import cpw.mods.modlauncher.api.ITransformationService; import cpw.mods.modlauncher.api.TypesafeMap; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.neoforgespi.locating.IModDirectoryLocatorFactory; -import net.neoforged.neoforgespi.locating.IModLocator; -import net.neoforged.neoforgespi.locating.IModFile; -import net.neoforged.neoforgespi.locating.ModFileFactory; - import java.nio.file.Path; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforgespi.locating.IModDirectoryLocatorFactory; +import net.neoforged.neoforgespi.locating.IModFile; +import net.neoforged.neoforgespi.locating.IModLocator; +import net.neoforged.neoforgespi.locating.ModFileFactory; /** * Global environment variables - allows discoverability with other systems without full forge @@ -25,7 +24,6 @@ */ public class Environment { public static final class Keys { - /** * The @{@link Dist} which is running. * Populated by forge during {@link ITransformationService#initialize(IEnvironment)} @@ -36,7 +34,7 @@ public static final class Keys { * Use {@link #MODDIRECTORYFACTORY} instead. */ @Deprecated - public static final Supplier>> MODFOLDERFACTORY = IEnvironment.buildKey("MODFOLDERFACTORY", Function.class); + public static final Supplier>> MODFOLDERFACTORY = IEnvironment.buildKey("MODFOLDERFACTORY", Function.class); /** * Build a custom modlocator based on a supplied directory, with custom name */ @@ -51,6 +49,7 @@ public static final class Keys { */ public static final Supplier>> PROGRESSMESSAGE = IEnvironment.buildKey("PROGRESSMESSAGE", Consumer.class); } + private static Environment INSTANCE; public static void build(IEnvironment environment) { @@ -62,7 +61,6 @@ public static Environment get() { return INSTANCE; } - private final IEnvironment environment; private final Dist dist; @@ -70,13 +68,14 @@ public static Environment get() { private Environment(IEnvironment setup) { this.environment = setup; - this.dist = setup.getProperty(Keys.DIST.get()).orElseThrow(()->new RuntimeException("Missing DIST in environment!")); - this.modFileFactory = setup.getProperty(Keys.MODFILEFACTORY.get()).orElseThrow(()->new RuntimeException("Missing MODFILEFACTORY in environment!")); + this.dist = setup.getProperty(Keys.DIST.get()).orElseThrow(() -> new RuntimeException("Missing DIST in environment!")); + this.modFileFactory = setup.getProperty(Keys.MODFILEFACTORY.get()).orElseThrow(() -> new RuntimeException("Missing MODFILEFACTORY in environment!")); } public Dist getDist() { return this.dist; } + public ModFileFactory getModFileFactory() { return this.modFileFactory; } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/GraphicsBootstrapper.java b/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/GraphicsBootstrapper.java index d4ec1431b..934563ca1 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/GraphicsBootstrapper.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/GraphicsBootstrapper.java @@ -9,8 +9,7 @@ * Defines a type which can be used to perform any bootstrap operations before * creating a window during the early loading window process. */ -public interface GraphicsBootstrapper -{ +public interface GraphicsBootstrapper { /** * The name of this bootstrapper. This is used for logging purposes. * diff --git a/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/ImmediateWindowProvider.java b/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/ImmediateWindowProvider.java index f9fc90224..1a306c3f7 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/ImmediateWindowProvider.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/earlywindow/ImmediateWindowProvider.java @@ -41,14 +41,15 @@ public interface ImmediateWindowProvider { * @param arguments The arguments provided to the Java process. This is the entire command line, so you can process * stuff from it. * @return A runnable that will be periodically ticked by FML during startup ON THE MAIN THREAD. This is usually - * a good place to put glfwPollEvents() tests. + * a good place to put glfwPollEvents() tests. */ Runnable initialize(String[] arguments); /** * This will be called during the handoff to minecraft to update minecraft with the size of the framebuffer we have. * Generally won't be called because Minecraft figures it out for itself. - * @param width Consumer of the framebuffer width + * + * @param width Consumer of the framebuffer width * @param height Consumer of the framebuffer height */ void updateFramebufferSize(IntConsumer width, IntConsumer height); @@ -60,9 +61,9 @@ public interface ImmediateWindowProvider { * information. Alternatively, you can force Mojang to update from the current position of the window in {@link #positionWindow(Optional, IntConsumer, IntConsumer, IntConsumer, IntConsumer)} * instead. This might give a more seamless experience. * - * @param width This is the width of the window Mojang expects - * @param height This is the height of the Window Mojang expects. - * @param title This is the title for the window. + * @param width This is the width of the window Mojang expects + * @param height This is the height of the Window Mojang expects. + * @param title This is the title for the window. * @param monitor This is the monitor it should appear on. * @return The window id */ @@ -71,11 +72,12 @@ public interface ImmediateWindowProvider { /** * This is called after window handoff to allow us to tell Mojang about our window's position. This might give a * preferrable user experience to users, because we just tell Mojang our truth, rather than accept theirs. - * @param monitor This is the monitor we're rendering on. Note that this is the Mojang monitor object. You might have trouble unwrapping it. - * @param widthSetter This sets the width on the Mojang side + * + * @param monitor This is the monitor we're rendering on. Note that this is the Mojang monitor object. You might have trouble unwrapping it. + * @param widthSetter This sets the width on the Mojang side * @param heightSetter This sets the height on the Mojang side - * @param xSetter This sets the x coordinate on the Mojang side - * @param ySetter This sets the y coordinate on the Mojang side + * @param xSetter This sets the x coordinate on the Mojang side + * @param ySetter This sets the y coordinate on the Mojang side * @return true if you've handled the window positioning - this skips the "forced fullscreen" code until a later stage */ boolean positionWindow(Optional monitor, IntConsumer widthSetter, IntConsumer heightSetter, IntConsumer xSetter, IntConsumer ySetter); @@ -84,12 +86,12 @@ public interface ImmediateWindowProvider { * Return a Supplier of an object extending the LoadingOverlay class from Mojang. This is what will be used once * the Mojang window code has taken over rendering of the window, to render the later stages of the loading process. * - * @param mc This supplies the Minecraft object - * @param ri This supplies the ReloadInstance object that tells us when the loading is finished - * @param ex This Consumes the final state of the loading - if it's an error you pass it the Throwable, otherwise you - * pass Optional.empty() + * @param mc This supplies the Minecraft object + * @param ri This supplies the ReloadInstance object that tells us when the loading is finished + * @param ex This Consumes the final state of the loading - if it's an error you pass it the Throwable, otherwise you + * pass Optional.empty() * @param fade This is the fade flag passed to LoadingOverlay. You probably want to ignore it. - * @param This is the type LoadingOverlay to allow type binding on the Mojang side + * @param This is the type LoadingOverlay to allow type binding on the Mojang side * @return A supplier of your later LoadingOverlay screen. */ Supplier loadingOverlay(Supplier mc, Supplier ri, Consumer> ex, boolean fade); @@ -97,6 +99,7 @@ public interface ImmediateWindowProvider { /** * This is called during the module loading process to allow us to find objects inside the GAME layer, such as a * later loading screen. + * * @param layer This is the GAME layer from ModLauncher */ void updateModuleReads(ModuleLayer layer); @@ -118,6 +121,7 @@ public interface ImmediateWindowProvider { /** * This is called during some very early startup routines to show a crash dialog * using e.g. tinyfd dialogs + * * @param message The message to display */ void crash(String message); diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/IConfigurable.java b/spi/src/main/java/net/neoforged/neoforgespi/language/IConfigurable.java index 7589eb7f4..6c65eabc9 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/IConfigurable.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/IConfigurable.java @@ -8,11 +8,11 @@ import java.util.List; import java.util.Optional; - /** * This is an interface for querying configuration elements */ public interface IConfigurable { Optional getConfigElement(final String... key); + public List getConfigList(final String... key); } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/ILifecycleEvent.java b/spi/src/main/java/net/neoforged/neoforgespi/language/ILifecycleEvent.java index 52a5e111d..12dcb6014 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/ILifecycleEvent.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/ILifecycleEvent.java @@ -12,4 +12,3 @@ default R concrete() { return (R) this; } } - diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/IModFileInfo.java b/spi/src/main/java/net/neoforged/neoforgespi/language/IModFileInfo.java index 99649d83e..0540fc4a3 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/IModFileInfo.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/IModFileInfo.java @@ -5,14 +5,12 @@ package net.neoforged.neoforgespi.language; -import net.neoforged.neoforgespi.locating.IModFile; -import org.apache.maven.artifact.versioning.VersionRange; - import java.util.List; import java.util.Map; +import net.neoforged.neoforgespi.locating.IModFile; +import org.apache.maven.artifact.versioning.VersionRange; -public interface IModFileInfo -{ +public interface IModFileInfo { List getMods(); record LanguageSpec(String languageName, VersionRange acceptedVersions) {} @@ -23,7 +21,7 @@ record LanguageSpec(String languageName, VersionRange acceptedVersions) {} boolean showAsDataPack(); - Map getFileProperties(); + Map getFileProperties(); String getLicense(); diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/IModInfo.java b/spi/src/main/java/net/neoforged/neoforgespi/language/IModInfo.java index 2a36e762f..aa4a46759 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/IModInfo.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/IModInfo.java @@ -5,19 +5,17 @@ package net.neoforged.neoforgespi.language; +import java.net.URL; +import java.util.List; +import java.util.Map; +import java.util.Optional; import net.neoforged.api.distmarker.Dist; import net.neoforged.neoforgespi.Environment; import net.neoforged.neoforgespi.locating.ForgeFeature; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.VersionRange; -import java.net.URL; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public interface IModInfo -{ +public interface IModInfo { // " " will just be the preferred version for Maven, but it will accept anything. // The space is very important, else we get a range that doesn't accept anything. VersionRange UNBOUNDED = MavenVersionAdapter.createFromVersionSpec(" "); @@ -38,7 +36,7 @@ public interface IModInfo String getNamespace(); - Map getModProperties(); + Map getModProperties(); Optional getUpdateURL(); @@ -66,8 +64,8 @@ enum DependencySide { public boolean isContained(Dist side) { return this == BOTH || dist[0] == side; } - public boolean isCorrectSide() - { + + public boolean isCorrectSide() { return this == BOTH || Environment.get().getDist().equals(this.dist[0]); } } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/IModLanguageProvider.java b/spi/src/main/java/net/neoforged/neoforgespi/language/IModLanguageProvider.java index 4e4ce1881..86482a03c 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/IModLanguageProvider.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/IModLanguageProvider.java @@ -1,28 +1,24 @@ /* * Minecraft Forge * Copyright (c) 2016-2018. - * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. - * * This library 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package net.neoforged.neoforgespi.language; -import net.neoforged.neoforgespi.locating.IModFile; - import java.util.function.Consumer; import java.util.function.Supplier; +import net.neoforged.neoforgespi.locating.IModFile; /** * Loaded as a ServiceLoader, from the plugin layer. @@ -31,8 +27,7 @@ * *

Version data is read from the manifest's implementation version. */ -public interface IModLanguageProvider -{ +public interface IModLanguageProvider { String name(); Consumer getFileVisitor(); @@ -41,8 +36,7 @@ public interface IModLanguageProvider * @deprecated Does not do anything. */ @Deprecated(forRemoval = true, since = "2.0.8") - default > void consumeLifecycleEvent(Supplier consumeEvent) { - } + default > void consumeLifecycleEvent(Supplier consumeEvent) {} interface IModLanguageLoader { T loadMod(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer layer); diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/MavenVersionAdapter.java b/spi/src/main/java/net/neoforged/neoforgespi/language/MavenVersionAdapter.java index 54d2582bc..d86bf6596 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/MavenVersionAdapter.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/MavenVersionAdapter.java @@ -12,6 +12,7 @@ public final class MavenVersionAdapter { private static final Logger LOGGER = LogManager.getLogger(); + private MavenVersionAdapter() {} public static VersionRange createFromVersionSpec(final String spec) { @@ -22,5 +23,4 @@ public static VersionRange createFromVersionSpec(final String spec) { throw new RuntimeException("Failed to parse spec", e); } } - } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/language/ModFileScanData.java b/spi/src/main/java/net/neoforged/neoforgespi/language/ModFileScanData.java index 2e8cd0a68..666cb242f 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/language/ModFileScanData.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/language/ModFileScanData.java @@ -5,22 +5,19 @@ package net.neoforged.neoforgespi.language; - import java.lang.annotation.ElementType; import java.util.*; import java.util.function.Predicate; - import org.objectweb.asm.Type; -public class ModFileScanData -{ +public class ModFileScanData { private final Set annotations = new LinkedHashSet<>(); private final Set classes = new LinkedHashSet<>(); - private final Map modTargets = new HashMap<>(); + private final Map modTargets = new HashMap<>(); private final List modFiles = new ArrayList<>(); public static Predicate interestingAnnotations() { - return t->true; + return t -> true; } public Set getClasses() { @@ -31,8 +28,7 @@ public Set getAnnotations() { return annotations; } - public void addLanguageLoader(final Map modTargetMap) - { + public void addLanguageLoader(final Map modTargetMap) { modTargets.putAll(modTargetMap); } @@ -40,8 +36,7 @@ public void addModFileInfo(IModFileInfo info) { this.modFiles.add(info); } - public Map getTargets() - { + public Map getTargets() { return modTargets; } diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/ForgeFeature.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/ForgeFeature.java index fe2e05f83..e13c63c5d 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/ForgeFeature.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/ForgeFeature.java @@ -5,6 +5,9 @@ package net.neoforged.neoforgespi.locating; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Predicate; import net.neoforged.api.distmarker.Dist; import net.neoforged.neoforgespi.language.IModInfo; import org.apache.maven.artifact.versioning.ArtifactVersion; @@ -12,28 +15,25 @@ import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Predicate; - /** * ForgeFeature is a simple test for mods for the presence of specific features * such as OpenGL of a specific version or better or whatever. * * {@snippet : - * ForgeFeature.registerFeature("openGLVersion", VersionFeatureTest.forVersionString(IModInfo.DependencySide.CLIENT, "3.2")); - *} + * ForgeFeature.registerFeature("openGLVersion", VersionFeatureTest.forVersionString(IModInfo.DependencySide.CLIENT, "3.2")); + * } * * This will be tested during early mod loading against lists of features in the mods.toml file for mods. Those * that are absent or out of range will be rejected. */ public class ForgeFeature { private ForgeFeature() {} + private static final Map> features = new HashMap<>(); public static void registerFeature(final String featureName, final IFeatureTest featureTest) { if (features.putIfAbsent(featureName, featureTest) != null) { - throw new IllegalArgumentException("ForgeFeature with name "+featureName +" exists"); + throw new IllegalArgumentException("ForgeFeature with name " + featureName + " exists"); } } @@ -46,8 +46,10 @@ public static boolean testFeature(final Dist side, final Bound bound) { public static Object featureValue(final Bound bound) { return features.getOrDefault(bound.featureName(), MISSING).featureValue(); } + public sealed interface IFeatureTest extends Predicate { IModInfo.DependencySide applicableSides(); + F convertFromString(final String value); String featureValue(); @@ -60,7 +62,7 @@ default boolean testSideWithString(final Dist side, final String value) { /** * A Bound, from a mods.toml file * - * @param featureName the name of the feature + * @param featureName the name of the feature * @param featureBound the requested bound */ public record Bound(String featureName, String featureBound, IModInfo modInfo) { @@ -69,14 +71,17 @@ public T bound() { return (T) features.getOrDefault(featureName, MISSING).convertFromString(featureBound); } } + /** * Version based feature test. Uses standard MavenVersion system. Will test the constructed version against * ranges requested by mods. + * * @param version The version we wish to test against */ public record VersionFeatureTest(IModInfo.DependencySide applicableSides, ArtifactVersion version) implements IFeatureTest { /** * Convenience method for constructing the feature test for a version string + * * @param version the string * @return the feature test for the supplied string */ diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/IDependencyLocator.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/IDependencyLocator.java index 8cc7dcbdf..81e675aed 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/IDependencyLocator.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/IDependencyLocator.java @@ -11,8 +11,7 @@ * Loaded as a ServiceLoader. Takes mechanisms for locating candidate "mod-dependencies". * and transforms them into {@link IModFile} objects. */ -public interface IDependencyLocator extends IModProvider -{ +public interface IDependencyLocator extends IModProvider { /** * Invoked to find all mod dependencies that this dependency locator can find. * It is not guaranteed that all these are loaded into the runtime, diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModDirectoryLocatorFactory.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModDirectoryLocatorFactory.java index e6c3db439..7c1557860 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModDirectoryLocatorFactory.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModDirectoryLocatorFactory.java @@ -5,9 +5,8 @@ package net.neoforged.neoforgespi.locating; -import net.neoforged.neoforgespi.Environment; - import java.nio.file.Path; +import net.neoforged.neoforgespi.Environment; /** * Functional interface for generating a custom {@link IModLocator} from a directory, with a specific name. diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModFile.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModFile.java index 35ab32cfb..ae9e73616 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModFile.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModFile.java @@ -6,17 +6,16 @@ package net.neoforged.neoforgespi.locating; import cpw.mods.jarhandling.SecureJar; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; import net.neoforged.neoforgespi.language.*; import net.neoforged.neoforgespi.language.IModFileInfo; import net.neoforged.neoforgespi.language.IModInfo; import net.neoforged.neoforgespi.language.IModLanguageProvider; import net.neoforged.neoforgespi.language.ModFileScanData; -import java.nio.file.Path; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - /** * Represents a single "mod" file in the runtime. * @@ -55,7 +54,7 @@ public interface IModFile { * * @return The string substitution map used during metadata load. */ - Supplier> getSubstitutionMap(); + Supplier> getSubstitutionMap(); /** * The type of the mod jar. @@ -67,6 +66,7 @@ public interface IModFile { /** * The path to the underlying mod file. + * * @return The path to the mod file. */ Path getFilePath(); @@ -107,6 +107,7 @@ public interface IModFile { /** * The raw file name of this file. + * * @return The raw file name. */ String getFileName(); @@ -121,6 +122,7 @@ public interface IModFile { /** * The metadata info related to this particular file. + * * @return The info for this file. */ IModFileInfo getModFileInfo(); diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModLocator.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModLocator.java index f7bb416ac..7cc4708a1 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModLocator.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModLocator.java @@ -1,20 +1,17 @@ /* * Minecraft Forge * Copyright (c) 2016-2019. - * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. - * * This library 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package net.neoforged.neoforgespi.locating; @@ -25,14 +22,15 @@ * Loaded as a ServiceLoader. Takes mechanisms for locating candidate "mods" * and transforms them into {@link IModFile} objects. */ -public interface IModLocator extends IModProvider -{ +public interface IModLocator extends IModProvider { /** * A simple record which contains either a valid modfile or a reason one failed to be constructed by {@link #scanMods()} + * * @param file the file - * @param ex an exception that occurred during the attempt to load the mod + * @param ex an exception that occurred during the attempt to load the mod */ record ModFileOrException(IModFile file, ModFileLoadingException ex) {} + /** * Invoked to find all mods that this mod locator can find. * It is not guaranteed that all these are loaded into the runtime, diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModProvider.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModProvider.java index 170b38353..187a958fa 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/IModProvider.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/IModProvider.java @@ -12,8 +12,7 @@ /** * Describes objects which can provide mods (or related jars) to the loading runtime. */ -public interface IModProvider -{ +public interface IModProvider { /** * The name of the provider. * Has to be unique between all providers loaded into the runtime. @@ -25,7 +24,7 @@ public interface IModProvider /** * Invoked to scan a particular {@link IModFile} for metadata. * - * @param modFile The mod file to scan. + * @param modFile The mod file to scan. * @param pathConsumer A consumer which extracts metadata from the path given. */ void scanFile(IModFile modFile, Consumer pathConsumer); diff --git a/spi/src/main/java/net/neoforged/neoforgespi/locating/ModFileFactory.java b/spi/src/main/java/net/neoforged/neoforgespi/locating/ModFileFactory.java index 396a848be..7a6f1d480 100644 --- a/spi/src/main/java/net/neoforged/neoforgespi/locating/ModFileFactory.java +++ b/spi/src/main/java/net/neoforged/neoforgespi/locating/ModFileFactory.java @@ -20,9 +20,10 @@ public interface ModFileFactory { /** * Builds a new mod file instance depending on the current runtime. - * @param jar The secure jar to load the mod file from. + * + * @param jar The secure jar to load the mod file from. * @param provider The provider which is offering the mod file for loading- - * @param parser The parser which is responsible for parsing the metadata of the file itself. + * @param parser The parser which is responsible for parsing the metadata of the file itself. * @return The mod file. */ IModFile build(final SecureJar jar, final IModProvider provider, ModFileInfoParser parser); diff --git a/spi/src/test/java/net/neoforged/neoforgespi/language/ModInfoTest.java b/spi/src/test/java/net/neoforged/neoforgespi/language/ModInfoTest.java index 7e8cd13d4..feabe9e85 100644 --- a/spi/src/test/java/net/neoforged/neoforgespi/language/ModInfoTest.java +++ b/spi/src/test/java/net/neoforged/neoforgespi/language/ModInfoTest.java @@ -5,11 +5,11 @@ package net.neoforged.neoforgespi.language; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; - public class ModInfoTest { /** * Regression test to ensure that unbounded ranges are actually unbounded.