diff --git a/.github/workflows/build-fabric.yml b/.github/workflows/build-fabric.yml deleted file mode 100644 index a722286..0000000 --- a/.github/workflows/build-fabric.yml +++ /dev/null @@ -1,38 +0,0 @@ -# Automatically build the project and run any configured tests for every push -# and submitted pull request. This can help catch issues that only occur on -# certain platforms or Java versions, and provides a first line of defense -# against bad commits. - -name: Build Fabric -on: [pull_request, push] - -jobs: - build: - strategy: - matrix: - # Use these Java versions - java: [21] # Current Java LTS - runs-on: ubuntu-22.04 - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup JDK ${{ matrix.java }} - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.java }} - distribution: "microsoft" - - - name: Make Gradle wrapper executable - run: chmod +x ./fabric/gradlew - - - name: Build Fabric Mod - working-directory: ./fabric - run: ./gradlew build - - - name: Capture build artifacts - if: ${{ matrix.java == '21' }} - uses: actions/upload-artifact@v4 - with: - name: Artifacts - path: ./fabric/build/libs/ diff --git a/.github/workflows/build-neoforge.yml b/.github/workflows/build-neoforge.yml deleted file mode 100644 index d97e261..0000000 --- a/.github/workflows/build-neoforge.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Build Neoforge -on: [pull_request, push] - -jobs: - build: - strategy: - matrix: - # Use these Java versions - java: [21] # Current Java LTS - runs-on: ubuntu-22.04 - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup JDK ${{ matrix.java }} - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.java }} - distribution: "microsoft" - - - name: Make Gradle wrapper executable - run: chmod +x ./neoforge/gradlew - - - name: Build Neoforge Mod - working-directory: ./neoforge - run: ./gradlew build - - - name: Capture build artifacts - if: ${{ matrix.java == '21' }} - uses: actions/upload-artifact@v4 - with: - name: Artifacts - path: ./neoforge/build/libs/ diff --git a/neoforge/.gitignore b/.gitignore similarity index 86% rename from neoforge/.gitignore rename to .gitignore index 31d2550..461017f 100644 --- a/neoforge/.gitignore +++ b/.gitignore @@ -11,7 +11,8 @@ out *.ipr *.iws *.iml -.idea +.idea/* +!.idea/scopes # gradle build @@ -21,6 +22,3 @@ build eclipse run runs -run-data - -repo \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 444335b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..b640020 --- /dev/null +++ b/build.gradle @@ -0,0 +1,6 @@ +plugins { + // see https://fabricmc.net/develop/ for new versions + id 'fabric-loom' version '1.10-SNAPSHOT' apply false + // see https://projects.neoforged.net/neoforged/moddevgradle for new versions + id 'net.neoforged.moddev' version '2.0.62-beta' apply false +} \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..9a20d71 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'groovy-gradle-plugin' +} diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle new file mode 100644 index 0000000..9fbd01f --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -0,0 +1,131 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +base { + archivesName = "${mod_id}-${project.name}-${minecraft_version}" +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(java_version) + withSourcesJar() + withJavadocJar() +} + +repositories { + mavenCentral() + // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = 'https://repo.spongepowered.org/repository/maven-public' + } + } + filter { includeGroupAndSubgroups('org.spongepowered') } + } + exclusiveContent { + forRepositories( + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org/' + }, + maven { + name = "NeoForge" + url = 'https://maven.neoforged.net/releases' + } + ) + filter { includeGroup('org.parchmentmc.data') } + } + maven { + name = 'BlameJared' + url = 'https://maven.blamejared.com' + } +} + +// Declare capabilities on the outgoing configurations. +// Read more about capabilities here: https://docs.gradle.org/current/userguide/component_capabilities.html#sec:declaring-additional-capabilities-for-a-local-component +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> + configurations."$variant".outgoing { + capability("$group:${project.name}:$version") + capability("$group:${base.archivesName.get()}:$version") + capability("$group:$mod_id-${project.name}-${minecraft_version}:$version") + capability("$group:$mod_id:$version") + } + publishing.publications.configureEach { + suppressPomMetadataWarningsFor(variant) + } +} + +sourcesJar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } +} + +jar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } + + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version': project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Built-On-Minecraft' : minecraft_version + ]) + } +} + +processResources { + var expandProps = [ + 'version' : version, + 'group' : project.group, //Else we target the task's group. + 'minecraft_version' : minecraft_version, + 'minecraft_version_range' : minecraft_version_range, + 'fabric_version' : fabric_version, + 'fabric_loader_version' : fabric_loader_version, + 'mod_name' : mod_name, + 'mod_author' : mod_author, + 'mod_id' : mod_id, + 'license' : license, + 'description' : project.description, + 'neoforge_version' : neoforge_version, + 'neoforge_loader_version_range': neoforge_loader_version_range, + 'credits' : credits, + 'java_version' : java_version + ] + + var jsonExpandProps = expandProps.collectEntries { + key, value -> [(key): value instanceof String ? value.replace("\n", "\\\\n") : value] + } + + filesMatching(['META-INF/mods.toml', 'META-INF/neoforge.mods.toml']) { + expand expandProps + } + + filesMatching(['pack.mcmeta', 'fabric.mod.json', '*.mixins.json']) { + expand jsonExpandProps + } + + inputs.properties(expandProps) +} + +publishing { + publications { + register('mavenJava', MavenPublication) { + artifactId base.archivesName.get() + from components.java + } + } + repositories { + maven { + url System.getenv('local_maven_url') + } + } +} diff --git a/buildSrc/src/main/groovy/multiloader-loader.gradle b/buildSrc/src/main/groovy/multiloader-loader.gradle new file mode 100644 index 0000000..660c7ef --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-loader.gradle @@ -0,0 +1,44 @@ +plugins { + id 'multiloader-common' +} + +configurations { + commonJava{ + canBeResolved = true + } + commonResources{ + canBeResolved = true + } +} + +dependencies { + compileOnly(project(':common')) { + capabilities { + requireCapability "$group:$mod_id" + } + } + commonJava project(path: ':common', configuration: 'commonJava') + commonResources project(path: ':common', configuration: 'commonResources') +} + +tasks.named('compileJava', JavaCompile) { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +processResources { + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} + +tasks.named('javadoc', Javadoc).configure { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +tasks.named('sourcesJar', Jar) { + dependsOn(configurations.commonJava) + from(configurations.commonJava) + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..24540d2 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'multiloader-common' + id 'net.neoforged.moddev' +} + +neoForge { + neoFormVersion = neo_form_version + // Automatically enable AccessTransformers if the file exists + def at = file('src/main/resources/META-INF/accesstransformer.cfg') + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } + parchment { + minecraftVersion = parchment_minecraft + mappingsVersion = parchment_version + } +} + +dependencies { + compileOnly group: 'org.spongepowered', name: 'mixin', version: '0.8.5' + // fabric and neoforge both bundle mixinextras, so it is safe to use it in common + compileOnly group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.3.5' + annotationProcessor group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.3.5' +} + +configurations { + commonJava { + canBeResolved = false + canBeConsumed = true + } + commonResources { + canBeResolved = false + canBeConsumed = true + } +} + +artifacts { + commonJava sourceSets.main.java.sourceDirectories.singleFile + commonResources sourceSets.main.resources.sourceDirectories.singleFile +} + diff --git a/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java b/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java new file mode 100644 index 0000000..e500a67 --- /dev/null +++ b/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java @@ -0,0 +1,18 @@ +package com.vaporvee.loadsupport; + +import com.vaporvee.loadsupport.platform.Services; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Items; + +public class CommonClass { + public static void init() { + // Constants.LOG.info("Hello from Common init on {}! we are currently in a {} environment!", Services.PLATFORM.getPlatformName(), Services.PLATFORM.getEnvironmentName()); + // Constants.LOG.info("The ID for diamonds is {}", BuiltInRegistries.ITEM.getKey(Items.DIAMOND)); + // if (Services.PLATFORM.isModLoaded("loadsupport")) + if (Services.PLATFORM.isEnvServer()) { + Constants.LOG.info(Constants.MOD_ID + " is a client mod only!"); + return; + } + Constants.LOG.info("Loading Load Support mod."); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/vaporvee/loadsupport/Constants.java b/common/src/main/java/com/vaporvee/loadsupport/Constants.java new file mode 100644 index 0000000..d068a68 --- /dev/null +++ b/common/src/main/java/com/vaporvee/loadsupport/Constants.java @@ -0,0 +1,11 @@ +package com.vaporvee.loadsupport; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Constants { + + public static final String MOD_ID = "loadsupport"; + public static final String MOD_NAME = "LoadSupport"; + public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); +} \ No newline at end of file diff --git a/common/src/main/java/com/vaporvee/loadsupport/mixin/MixinMinecraft.java b/common/src/main/java/com/vaporvee/loadsupport/mixin/MixinMinecraft.java new file mode 100644 index 0000000..0aed199 --- /dev/null +++ b/common/src/main/java/com/vaporvee/loadsupport/mixin/MixinMinecraft.java @@ -0,0 +1,19 @@ +package com.vaporvee.loadsupport.mixin; + +import com.vaporvee.loadsupport.Constants; +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class MixinMinecraft { + + @Inject(at = @At("TAIL"), method = "") + private void init(CallbackInfo info) { + + Constants.LOG.info("This line is printed by an example mod common mixin!"); + Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/vaporvee/loadsupport/platform/Services.java b/common/src/main/java/com/vaporvee/loadsupport/platform/Services.java new file mode 100644 index 0000000..436b9fe --- /dev/null +++ b/common/src/main/java/com/vaporvee/loadsupport/platform/Services.java @@ -0,0 +1,30 @@ +package com.vaporvee.loadsupport.platform; + +import com.vaporvee.loadsupport.Constants; +import com.vaporvee.loadsupport.platform.services.IPlatformHelper; + +import java.util.ServiceLoader; + +// Service loaders are a built-in Java feature that allow us to locate implementations of an interface that vary from one +// environment to another. In the context of MultiLoader we use this feature to access a mock API in the common code that +// is swapped out for the platform specific implementation at runtime. +public class Services { + + // In this example we provide a platform helper which provides information about what platform the mod is running on. + // For example this can be used to check if the code is running on Forge vs Fabric, or to ask the modloader if another + // mod is loaded. + public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class); + + // This code is used to load a service for the current environment. Your implementation of the service must be defined + // manually by including a text file in META-INF/services named with the fully qualified class name of the service. + // Inside the file you should write the fully qualified class name of the implementation to load for the platform. For + // example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper. + public static T load(Class clazz) { + + final T loadedService = ServiceLoader.load(clazz) + .findFirst() + .orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); + Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz); + return loadedService; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/vaporvee/loadsupport/platform/services/IPlatformHelper.java b/common/src/main/java/com/vaporvee/loadsupport/platform/services/IPlatformHelper.java new file mode 100644 index 0000000..d232689 --- /dev/null +++ b/common/src/main/java/com/vaporvee/loadsupport/platform/services/IPlatformHelper.java @@ -0,0 +1,43 @@ +package com.vaporvee.loadsupport.platform.services; + +public interface IPlatformHelper { + + /** + * Gets the name of the current platform + * + * @return The name of the current platform. + */ + String getPlatformName(); + + /** + * Checks if a mod with the given id is loaded. + * + * @param modId The mod to check if it is loaded. + * @return True if the mod is loaded, false otherwise. + */ + boolean isModLoaded(String modId); + + /** + * Check if the game is currently in a client environment. + * + * @return True if in a client environment, false otherwise. + */ + boolean isEnvServer(); + + /** + * Check if the game is currently in a development environment. + * + * @return True if in a development environment, false otherwise. + */ + boolean isDevelopmentEnvironment(); + + /** + * Gets the name of the environment type as a string. + * + * @return The name of the environment type. + */ + default String getEnvironmentName() { + + return isDevelopmentEnvironment() ? "development" : "production"; + } +} \ No newline at end of file diff --git a/common/src/main/resources/loadsupport.mixins.json b/common/src/main/resources/loadsupport.mixins.json new file mode 100644 index 0000000..ff35e28 --- /dev/null +++ b/common/src/main/resources/loadsupport.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.vaporvee.loadsupport.mixin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_18", + "mixins": [], + "client": [ + "MixinMinecraft" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + } +} + diff --git a/common/src/main/resources/pack.mcmeta b/common/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..52854ec --- /dev/null +++ b/common/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "${mod_name}", + "pack_format": 8 + } +} \ No newline at end of file diff --git a/debug.log b/debug.log deleted file mode 100644 index 78fae45..0000000 --- a/debug.log +++ /dev/null @@ -1,7 +0,0 @@ -[1004/203846.550:ERROR:crashpad_client_win.cc(810)] not connected -[1004/210622.059:ERROR:crashpad_client_win.cc(810)] not connected -[1004/210622.163:ERROR:crashpad_client_win.cc(810)] not connected -[1004/223616.841:ERROR:crashpad_client_win.cc(810)] not connected -[1004/233021.354:ERROR:crashpad_client_win.cc(810)] not connected -[1004/233021.469:ERROR:crashpad_client_win.cc(810)] not connected -[1004/233120.351:ERROR:crashpad_client_win.cc(810)] not connected diff --git a/fabric/.gitignore b/fabric/.gitignore deleted file mode 100644 index e2b2a39..0000000 --- a/fabric/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -# gradle - -.gradle/ -build/ -out/ -classes/ - -# eclipse - -*.launch - -# idea - -.idea/ -*.iml -*.ipr -*.iws - -# vscode - -.settings/ -.vscode/ -bin/ -.classpath -.project - -# macos - -*.DS_Store - -# fabric - -run/ - -# java - -hs_err_*.log -replay_*.log -*.hprof -*.jfr - -debug.log \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index f578795..f4fde12 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,85 +1,37 @@ -plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' - id 'maven-publish' -} - -version = project.mod_version -group = project.maven_group - -base { - archivesName = project.archives_base_name -} - -repositories { - mavenCentral() - maven { url "https://maven.shedaniel.me/" } - maven { url "https://maven.terraformersmc.com/releases/" } -} - -loom { - splitEnvironmentSourceSets() - - mods { - "loadsupport" { - sourceSet sourceSets.main - sourceSet sourceSets.client - } - } - -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - - implementation 'com.moandjiezana.toml:toml4j:0.7.2' - - modApi "me.shedaniel.cloth:cloth-config-fabric:15.0.140" -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = 21 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - -jar { - from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} - } -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - } +plugins { + id 'multiloader-loader' + id 'fabric-loom' +} +dependencies { + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${parchment_minecraft}:${parchment_version}@zip") + } + modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" +} + +loom { + def aw = project(':common').file("src/main/resources/${mod_id}.accesswidener") + if (aw.exists()) { + accessWidenerPath.set(aw) + } + mixin { + defaultRefmapName.set("${mod_id}.refmap.json") + } + runs { + client { + client() + setConfigName('Fabric Client') + ideConfigGenerated(true) + runDir('runs/client') + } + server { + server() + setConfigName('Fabric Server') + ideConfigGenerated(true) + runDir('runs/server') + } + } } \ No newline at end of file diff --git a/fabric/gradle.properties b/fabric/gradle.properties deleted file mode 100644 index 439423e..0000000 --- a/fabric/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G -org.gradle.parallel=true - -# Fabric Properties -# check these on https://fabricmc.net/develop -minecraft_version=1.21.1 -yarn_mappings=1.21.1+build.3 -loader_version=0.16.5 - -# Mod Properties -mod_version=1.1.0-fabric-1.21.1 -maven_group=com.vaporvee.loadsupport -archives_base_name=loadsupport - -# Dependencies -fabric_version=0.105.0+1.21.1 \ No newline at end of file diff --git a/fabric/gradle/wrapper/gradle-wrapper.jar b/fabric/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9..0000000 Binary files a/fabric/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/fabric/gradle/wrapper/gradle-wrapper.properties b/fabric/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9355b41..0000000 --- a/fabric/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/fabric/settings.gradle b/fabric/settings.gradle deleted file mode 100644 index 75c4d72..0000000 --- a/fabric/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -pluginManagement { - repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - mavenCentral() - gradlePluginPortal() - } -} \ No newline at end of file diff --git a/fabric/src/client/java/com/vaporvee/loadsupport/LSConfig.java b/fabric/src/client/java/com/vaporvee/loadsupport/LSConfig.java deleted file mode 100644 index 26cd39d..0000000 --- a/fabric/src/client/java/com/vaporvee/loadsupport/LSConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.vaporvee.loadsupport; - -import me.shedaniel.autoconfig.ConfigData; -import me.shedaniel.autoconfig.annotation.Config; - -@Config(name = LoadSupport.MOD_ID) -public class LSConfig implements ConfigData { - boolean startSound = true; - float minMemory = 4.0f; - String errorTitle = "Error: Not enough Java memory!"; - String errorDescription = "Please allocate at least {minMemory} GB of Java memory to your Minecraft Instance! You have currently {currentMemory} GB allocated."; -} diff --git a/fabric/src/client/java/com/vaporvee/loadsupport/LSWindow.java b/fabric/src/client/java/com/vaporvee/loadsupport/LSWindow.java deleted file mode 100644 index 9f94e93..0000000 --- a/fabric/src/client/java/com/vaporvee/loadsupport/LSWindow.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.vaporvee.loadsupport; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.AccessibilityOnboardingScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Text; - -import javax.swing.*; -import java.awt.*; -import java.util.List; - -public class LSWindow { - static boolean windowOpen = false; - private static JFrame window; - - public static void createWindow(MinecraftClient minecraftClient, Screen screen) { - if(screen instanceof TitleScreen || screen instanceof AccessibilityOnboardingScreen){ - minecraftClient.setScreen(new BlockedScreen()); - if(window != null){ - window.dispose(); - } - return; - } - try { - if (!windowOpen) { - windowOpen = true; - SwingUtilities.invokeLater(() -> { - window = new JFrame(LoadSupportClient.getWarningMessage()[0]); - window.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); - window.setSize(400, 200); - window.setLocationRelativeTo(null); - - JLabel message = new JLabel("

"+ LoadSupportClient.getWarningMessage()[1]+"

", JLabel.CENTER); - JButton exitButton = new JButton("OK"); - - exitButton.addActionListener(e -> { - window.dispose(); - minecraftClient.stop(); - }); - - window.setLayout(new BorderLayout()); - window.add(message, BorderLayout.CENTER); - window.add(exitButton, BorderLayout.SOUTH); - window.setVisible(true); - }); - } - } catch (RuntimeException e) { - LoadSupport.logger.error(String.valueOf(e)); - } - } - @Environment(EnvType.CLIENT) - public static class BlockedScreen extends Screen { - protected BlockedScreen() { - super(Text.literal("BlockedScreen")); - } - - @Override - public void init(){ - ButtonWidget closeButton = ButtonWidget.builder(Text.literal("Quit Game"), button -> { - MinecraftClient.getInstance().scheduleStop(); - }) - .dimensions(width / 2 - 100, height - 35 , 200, 20) - .build(); - addDrawableChild(closeButton); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); - - String title = LoadSupportClient.getWarningMessage()[0]; - String body = LoadSupportClient.getWarningMessage()[1]; - - int lineHeight = textRenderer.fontHeight + 5; - int maxTextWidth = width - 40; - List wrappedLines = textRenderer.wrapLines(Text.literal(body), maxTextWidth); - - int totalTextHeight = (wrappedLines.size() * lineHeight) + lineHeight + 10; - int startY = (height / 2) - (totalTextHeight / 2); - - context.drawCenteredTextWithShadow(textRenderer, Text.literal(title), width / 2, startY, 0xf94449); - - int bodyStartY = startY + lineHeight + 10; - - // Automatic line breaks - for (int i = 0; i < wrappedLines.size(); i++) { - OrderedText line = wrappedLines.get(i); - context.drawCenteredTextWithShadow(textRenderer, line, width / 2, bodyStartY + (i * lineHeight), 0xffffff); - } - } - } -} diff --git a/fabric/src/client/java/com/vaporvee/loadsupport/LoadNotifier.java b/fabric/src/client/java/com/vaporvee/loadsupport/LoadNotifier.java deleted file mode 100644 index c80584e..0000000 --- a/fabric/src/client/java/com/vaporvee/loadsupport/LoadNotifier.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.vaporvee.loadsupport; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.sound.SoundEvents; - -public class LoadNotifier { - static boolean wasPlayed = false; - public static void notifySound(MinecraftClient client){ - if(LoadSupportClient.config.startSound && !wasPlayed) { - wasPlayed = true; - client.getSoundManager().play( - PositionedSoundInstance.master(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 1.0F) // Use any sound event you like - ); - } - } -} diff --git a/fabric/src/client/java/com/vaporvee/loadsupport/LoadSupportClient.java b/fabric/src/client/java/com/vaporvee/loadsupport/LoadSupportClient.java deleted file mode 100644 index 0d27332..0000000 --- a/fabric/src/client/java/com/vaporvee/loadsupport/LoadSupportClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.vaporvee.loadsupport; - -import me.shedaniel.autoconfig.AutoConfig; -import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.AccessibilityOnboardingScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; - -public class LoadSupportClient implements ClientModInitializer { - public static LSConfig config; - private static float allocatedMemoryInGB; - @Override - public void onInitializeClient() { - AutoConfig.register(LSConfig.class, Toml4jConfigSerializer::new); - config = AutoConfig.getConfigHolder(LSConfig.class).getConfig(); - allocatedMemoryInGB = Runtime.getRuntime().maxMemory() / 1073741824f; // Hardcoded value for GB - allocatedMemoryInGB = Math.round(allocatedMemoryInGB * 10) / 10f; - LoadSupport.logger.info(String.format("Allocated Memory: %.1f GB", allocatedMemoryInGB)); - ScreenEvents.BEFORE_INIT.register(LoadSupportClient::beforeWindowInit); - } - - public static String[] getWarningMessage(){ - return new String[]{config.errorTitle, config.errorDescription - .replace("{minMemory}", String.valueOf(config.minMemory)) - .replace("{currentMemory}", String.valueOf(allocatedMemoryInGB))}; - }; - private static void beforeWindowInit(MinecraftClient minecraftClient, Screen screen, int i, int i1) { - if(config.minMemory > allocatedMemoryInGB){ - System.setProperty("java.awt.headless", "false"); // Hacky stupid thing but it works I guess... - LSWindow.createWindow(minecraftClient, screen); - } - if (screen instanceof TitleScreen || screen instanceof AccessibilityOnboardingScreen){ - LoadNotifier.notifySound(minecraftClient); - } - } -} \ No newline at end of file diff --git a/fabric/src/main/java/com/vaporvee/loadsupport/LoadSupport.java b/fabric/src/main/java/com/vaporvee/loadsupport/LoadSupport.java index d90466f..d0dce3d 100644 --- a/fabric/src/main/java/com/vaporvee/loadsupport/LoadSupport.java +++ b/fabric/src/main/java/com/vaporvee/loadsupport/LoadSupport.java @@ -1,23 +1,18 @@ package com.vaporvee.loadsupport; -import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.loader.api.FabricLoader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class LoadSupport implements ModInitializer { - public static final String MOD_ID = "loadsupport"; + + @Override + public void onInitialize() { + + // This method is invoked by the Fabric mod loader when it is ready + // to load your mod. You can access Fabric and Common code in this + // project. - public static final Logger logger = LoggerFactory.getLogger("Load Support"); - - @Override - public void onInitialize() { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) { - logger.info(MOD_ID + " is a client mod only!"); - return; - } - logger.info("Loading Load Support mod."); - } -} \ No newline at end of file + // Use Fabric to bootstrap the Common mod. + Constants.LOG.info("Hello Fabric world!"); + CommonClass.init(); + } +} diff --git a/fabric/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java b/fabric/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java new file mode 100644 index 0000000..4315cde --- /dev/null +++ b/fabric/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java @@ -0,0 +1,20 @@ +package com.vaporvee.loadsupport.mixin; + +import com.vaporvee.loadsupport.Constants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class MixinTitleScreen { + + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + + Constants.LOG.info("This line is printed by an example mod mixin from Fabric!"); + Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vaporvee/loadsupport/platform/FabricPlatformHelper.java b/fabric/src/main/java/com/vaporvee/loadsupport/platform/FabricPlatformHelper.java new file mode 100644 index 0000000..edd4536 --- /dev/null +++ b/fabric/src/main/java/com/vaporvee/loadsupport/platform/FabricPlatformHelper.java @@ -0,0 +1,30 @@ +package com.vaporvee.loadsupport.platform; + +import com.vaporvee.loadsupport.platform.services.IPlatformHelper; +import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; + +public class FabricPlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + return "Fabric"; + } + + @Override + public boolean isModLoaded(String modId) { + + return FabricLoader.getInstance().isModLoaded(modId); + } + + @Override + public boolean isEnvServer() { + return FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER; + } + + @Override + public boolean isDevelopmentEnvironment() { + + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } +} diff --git a/fabric/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper b/fabric/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper new file mode 100644 index 0000000..010e9e7 --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper @@ -0,0 +1 @@ +com.vaporvee.loadsupport.platform.FabricPlatformHelper \ No newline at end of file diff --git a/fabric/src/main/resources/assets/loadsupport/icon.png b/fabric/src/main/resources/assets/loadsupport/icon.png deleted file mode 100644 index 61c0efd..0000000 Binary files a/fabric/src/main/resources/assets/loadsupport/icon.png and /dev/null differ diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 275b6ec..b66f7be 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,42 +1,36 @@ { - "schemaVersion": 1, - "id": "loadsupport", - "version": "${version}", - "name": "Load Support", - "description": "Shows when the user has too less Java memory allocated, and plays a sound when the game has loaded.", - "authors": [ - { - "name": "vaporvee", - "contact": { - "homepage": "https://vaporvee.com" - } + "schemaVersion": 1, + "id": "${mod_id}", + "version": "${version}", + "name": "${mod_name}", + "description": "${description}", + "authors": [ + "${mod_author}" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + "license": "${license}", + "icon": "${mod_id}.png", + "environment": "*", + "entrypoints": { + "main": [ + "com.vaporvee.loadsupport.LoadSupport" + ] + }, + "mixins": [ + "${mod_id}.mixins.json", + "${mod_id}.fabric.mixins.json" + ], + "depends": { + "fabricloader": ">=${fabric_loader_version}", + "fabric-api": "*", + "minecraft": "~${minecraft_version}", + "java": ">=${java_version}" + }, + "suggests": { + "another-mod": "*" } - ], - "contact": { - "sources": "https://github.com/vaporvee/EnoughMemory", - "issues": "https://github.com/vaporvee/EnoughMemory/issues" - }, - "custom": { - "modmenu": { - "links": { - "modmenu.discord": "https://discord.gg/StMHnsC9s2" - } - } - }, - "license": "Apache License 2.0", - "icon": "assets/loadsupport/icon.png", - "environment": "*", - "entrypoints": { - "main": ["com.vaporvee.loadsupport.LoadSupport"], - "client": ["com.vaporvee.loadsupport.LoadSupportClient"] - }, - "depends": { - "fabricloader": ">=0.16.5", - "minecraft": "~1.21.1", - "java": ">=21", - "fabric-api": "*" - }, - "suggests": { - "another-mod": "*" - } } + \ No newline at end of file diff --git a/fabric/src/main/resources/loadsupport.fabric.mixins.json b/fabric/src/main/resources/loadsupport.fabric.mixins.json new file mode 100644 index 0000000..619a6f7 --- /dev/null +++ b/fabric/src/main/resources/loadsupport.fabric.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.vaporvee.loadsupport.mixin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_21", + "mixins": [], + "client": [ + "MixinTitleScreen" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + } +} + diff --git a/fabric/src/main/resources/loadsupport.mixins.json b/fabric/src/main/resources/loadsupport.mixins.json deleted file mode 100644 index 8fbaf89..0000000 --- a/fabric/src/main/resources/loadsupport.mixins.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "required": true, - "package": "com.vaporvee.loadsupport.mixin", - "compatibilityLevel": "JAVA_21", - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ed447b3 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,36 @@ +# Important Notes: +# Every field you add must be added to buildSrc/src/main/groovy/multiloader-common.gradle expandProps map. + +# Project +version=1.2.0 +group=com.vaporvee.loadsupport +java_version=21 + +# Common +minecraft_version=1.21.5 +mod_name=Load Support +mod_author=vaporvee +mod_id=loadsupport +license=Apache License 2.0 +credits= +description=Shows when the user has too less Java memory allocated, and plays a sound when the game has loaded. +minecraft_version_range=[1.21.5, 1.22) +## This is the version of minecraft that the 'common' project uses, you can find a list of all versions here +## https://projects.neoforged.net/neoforged/neoform +neo_form_version=1.21.5-20250325.162830 +# The version of ParchmentMC that is used, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions +parchment_minecraft=1.21.4 +parchment_version=2025.03.23 + +# Fabric +fabric_version=0.119.5+1.21.5 +fabric_loader_version=0.16.10 + + +# NeoForge +neoforge_version=21.5.4-beta +neoforge_loader_version_range=[4,) + +# Gradle +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false diff --git a/fabric/gradlew b/gradlew old mode 100644 new mode 100755 similarity index 99% rename from fabric/gradlew rename to gradlew index f5feea6..f3b75f3 --- a/fabric/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/fabric/gradlew.bat b/gradlew.bat similarity index 100% rename from fabric/gradlew.bat rename to gradlew.bat diff --git a/neoforge/.gitattributes b/neoforge/.gitattributes deleted file mode 100644 index f811f6a..0000000 --- a/neoforge/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -# Disable autocrlf on generated files, they always generate with LF -# Add any extra files or paths here to make git stop saying they -# are changed when only line endings change. -src/generated/**/.cache/cache text eol=lf -src/generated/**/*.json text eol=lf diff --git a/neoforge/README.md b/neoforge/README.md deleted file mode 100644 index b421122..0000000 --- a/neoforge/README.md +++ /dev/null @@ -1,25 +0,0 @@ - -Installation information -======= - -This template repository can be directly cloned to get you started with a new -mod. Simply create a new repository cloned from this one, by following the -instructions provided by [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template). - -Once you have your clone, simply open the repository in the IDE of your choice. The usual recommendation for an IDE is either IntelliJ IDEA or Eclipse. - -If at any point you are missing libraries in your IDE, or you've run into problems you can -run `gradlew --refresh-dependencies` to refresh the local cache. `gradlew clean` to reset everything -{this does not affect your code} and then start the process again. - -Mapping Names: -============ -By default, the MDK is configured to use the official mapping names from Mojang for methods and fields -in the Minecraft codebase. These names are covered by a specific license. All modders should be aware of this -license. For the latest license text, refer to the mapping file itself, or the reference copy here: -https://github.com/NeoForged/NeoForm/blob/main/Mojang.md - -Additional Resources: -========== -Community Documentation: https://docs.neoforged.net/ -NeoForged Discord: https://discord.neoforged.net/ diff --git a/neoforge/TEMPLATE_LICENSE.txt b/neoforge/TEMPLATE_LICENSE.txt deleted file mode 100644 index e69de29..0000000 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index d874053..ddf9484 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,180 +1,39 @@ -plugins { - id 'java-library' - id 'maven-publish' - id 'net.neoforged.moddev' version '1.0.20' -} - -tasks.named('wrapper', Wrapper).configure { - // Define wrapper values here so as to not have to always do so when updating gradlew.properties. - // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with - // documentation attached on cursor hover of gradle classes and methods. However, this comes with increased - // file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards. - // (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`) - distributionType = Wrapper.DistributionType.BIN -} - -version = mod_version -group = mod_group_id - -repositories { - mavenLocal() - maven { - url "https://maven.su5ed.dev/releases" - } - maven { - url "https://maven.shedaniel.me/" - } -} - -base { - archivesName = mod_id -} - -// Mojang ships Java 21 to end users starting in 1.20.5, so mods should target Java 21. -java.toolchain.languageVersion = JavaLanguageVersion.of(21) - -neoForge { - // Specify the version of NeoForge to use. - version = project.neo_version - - parchment { - mappingsVersion = project.parchment_mappings_version - minecraftVersion = project.parchment_minecraft_version - } - - // This line is optional. Access Transformers are automatically detected - // accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - client() - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - server { - server() - programArgument '--nogui' - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - // This run config launches GameTestServer and runs all registered gametests, then exits. - // By default, the server will crash when no gametests are provided. - // The gametest system is also enabled by default for other run configs under the /test command. - gameTestServer { - type = "gameTestServer" - systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id - } - - data { - data() - - // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it - // gameDirectory = project.file('run-data') - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() - } - - // applies to all the run configs above - configureEach { - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - systemProperty 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - logLevel = org.slf4j.event.Level.DEBUG - } - } - - mods { - // define mod <-> source bindings - // these are used to tell the game which sources are for which mod - // mostly optional in a single mod project - // but multi mod projects should define one per mod - "${mod_id}" { - sourceSet(sourceSets.main) - } - } -} - -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } - -// Sets up a dependency configuration called 'localRuntime'. -// This configuration should be used instead of 'runtimeOnly' to declare -// a dependency that will be present for runtime testing but that is -// "optional", meaning it will not be pulled by dependents of this mod. -configurations { - runtimeClasspath.extendsFrom localRuntime -} - -dependencies { - // For more info: - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - - implementation "org.sinytra.forgified-fabric-api:forgified-fabric-api:0.104.0+2.0.14+1.21.1" - implementation "me.shedaniel.cloth:cloth-config-neoforge:15.0.140" -} - -// This block of code expands all declared replace properties in the specified resource targets. -// A missing property will result in an error. Properties are expanded using ${} Groovy notation. -var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { - var replaceProperties = [ - minecraft_version : minecraft_version, - minecraft_version_range: minecraft_version_range, - neo_version : neo_version, - neo_version_range : neo_version_range, - loader_version_range : loader_version_range, - mod_id : mod_id, - mod_name : mod_name, - mod_license : mod_license, - mod_version : mod_version, - mod_authors : mod_authors, - mod_description : mod_description - ] - inputs.properties replaceProperties - expand replaceProperties - from "src/main/templates" - into "build/generated/sources/modMetadata" -} -// Include the output of "generateModMetadata" as an input directory for the build -// this works with both building through Gradle and the IDE. -sourceSets.main.resources.srcDir generateModMetadata -// To avoid having to run "generateModMetadata" manually, make it run on every project reload -neoForge.ideSyncTask generateModMetadata - -// Example configuration to allow publishing using the maven-publish plugin -publishing { - publications { - register('mavenJava', MavenPublication) { - from components.java - } - } - repositories { - maven { - url "file://${project.projectDir}/repo" - } - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} - -// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. -idea { - module { - downloadSources = true - downloadJavadoc = true - } -} +plugins { + id 'multiloader-loader' + id 'net.neoforged.moddev' +} + +neoForge { + version = neoforge_version + // Automatically enable neoforge AccessTransformers if the file exists + def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg') + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } + parchment { + minecraftVersion = parchment_minecraft + mappingsVersion = parchment_version + } + runs { + configureEach { + systemProperty('neoforge.enabledGameTestNamespaces', mod_id) + ideName = "NeoForge ${it.name.capitalize()} (${project.path})" // Unify the run config names with fabric + } + client { + client() + } + data { + clientData() + } + server { + server() + } + } + mods { + "${mod_id}" { + sourceSet sourceSets.main + } + } +} + +sourceSets.main.resources { srcDir 'src/generated/resources' } \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 47a5d2a..0000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1,45 +0,0 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -org.gradle.jvmargs=-Xmx1G -org.gradle.daemon=true -org.gradle.parallel=true -org.gradle.caching=true -org.gradle.configuration-cache=true - -#read more on this at https://github.com/neoforged/ModDevGradle?tab=readme-ov-file#better-minecraft-parameter-names--javadoc-parchment -# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started -parchment_minecraft_version=1.21 -parchment_mappings_version=2024.07.28 -# Environment Properties -# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge -# The Minecraft version must agree with the Neo version to get a valid artifact -minecraft_version=1.21.1 -# The Minecraft version range can use any release version of Minecraft as bounds. -# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly -# as they do not follow standard versioning conventions. -minecraft_version_range=[1.21.1, 1.22) -# The Neo version must agree with the Minecraft version to get a valid artifact -neo_version=21.1.64 -# The Neo version range can use any version of Neo as bounds -neo_version_range=[21.1.0,) -# The loader version range can only use the major version of FML as bounds -loader_version_range=[4,) - -## Mod Properties - -# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} -# Must match the String constant located in the main mod class annotated with @Mod. -mod_id=loadsupport -# The human-readable display name for the mod. -mod_name=Load Support -# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. -mod_license=Apache License 2.0 -# The mod version. See https://semver.org/ -mod_version=1.1.0-neoforge-1.21.1 -# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. -# This should match the base package used for the mod sources. -# See https://maven.apache.org/guides/mini/guide-naming-conventions.html -mod_group_id=com.vaporvee.loadsupport -# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors=vaporvee -# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Shows when the user has too less Java memory allocated, and plays a sound when the game has loaded. diff --git a/neoforge/gradle/wrapper/gradle-wrapper.jar b/neoforge/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 2c35211..0000000 Binary files a/neoforge/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/neoforge/gradle/wrapper/gradle-wrapper.properties b/neoforge/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 09523c0..0000000 --- a/neoforge/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/neoforge/gradlew b/neoforge/gradlew deleted file mode 100644 index f5feea6..0000000 --- a/neoforge/gradlew +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/neoforge/gradlew.bat b/neoforge/gradlew.bat deleted file mode 100644 index 9d21a21..0000000 --- a/neoforge/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/neoforge/settings.gradle b/neoforge/settings.gradle deleted file mode 100644 index ada876e..0000000 --- a/neoforge/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - maven { url = 'https://maven.neoforged.net/releases' } - } -} - -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' -} diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/LSConfig.java b/neoforge/src/main/java/com/vaporvee/loadsupport/LSConfig.java deleted file mode 100644 index 7187192..0000000 --- a/neoforge/src/main/java/com/vaporvee/loadsupport/LSConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.vaporvee.loadsupport; - -import me.shedaniel.autoconfig.ConfigData; -import me.shedaniel.autoconfig.annotation.Config; - -@Config(name = LoadSupport.MODID) -public class LSConfig implements ConfigData { - boolean startSound = true; - float minMemory = 4.0f; - String errorTitle = "Error: Not enough Java memory!"; - String errorDescription = "Please allocate at least {minMemory} GB of Java memory to your Minecraft Instance! You have currently {currentMemory} GB allocated."; -} diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/LSWindow.java b/neoforge/src/main/java/com/vaporvee/loadsupport/LSWindow.java deleted file mode 100644 index 6800e86..0000000 --- a/neoforge/src/main/java/com/vaporvee/loadsupport/LSWindow.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.vaporvee.loadsupport; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.AccessibilityOnboardingScreen; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.network.chat.Component; -import net.minecraft.client.gui.components.Button; -import net.minecraft.util.FormattedCharSequence; - - -import javax.swing.*; -import java.awt.*; -import java.util.List; - - -public class LSWindow { - static boolean windowOpen = false; - private static JFrame window; - - public static void createWindow(Minecraft minecraftClient, Screen screen) { - if(screen instanceof TitleScreen || screen instanceof AccessibilityOnboardingScreen){ - minecraftClient.setScreen(new BlockedScreen()); - if(window != null){ - window.dispose(); - } - return; - } - try { - if (!windowOpen) { - windowOpen = true; - SwingUtilities.invokeLater(() -> { - window = new JFrame(LoadSupport.getWarningMessage()[0]); - window.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); - window.setSize(400, 200); - window.setLocationRelativeTo(null); - - JLabel message = new JLabel("

"+ LoadSupport.getWarningMessage()[1]+"

", JLabel.CENTER); - JButton exitButton = new JButton("OK"); - - exitButton.addActionListener(e -> { - window.dispose(); - minecraftClient.stop(); - }); - - window.setLayout(new BorderLayout()); - window.add(message, BorderLayout.CENTER); - window.add(exitButton, BorderLayout.SOUTH); - window.setVisible(true); - }); - } - } catch (RuntimeException e) { - LoadSupport.logger.error(String.valueOf(e)); - } - } - public static class BlockedScreen extends Screen { - - protected BlockedScreen() { - super(Component.literal("BlockedScreen")); - } - - @Override - protected void init() { - Button closeButton = Button.builder(Component.literal("Quit Game"), button -> Minecraft.getInstance().stop()) - .bounds(this.width / 2 - 100, this.height - 35, 200, 20) - .build(); - - this.addRenderableWidget(closeButton); - } - - @Override - public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) { - super.render(graphics, mouseX, mouseY, delta); - - String title = LoadSupport.getWarningMessage()[0]; - String body = LoadSupport.getWarningMessage()[1]; - - int lineHeight = this.font.lineHeight + 5; - int maxTextWidth = this.width - 40; - - List wrappedLines = this.font.split(Component.literal(body), maxTextWidth); - - int totalTextHeight = (wrappedLines.size() * lineHeight) + lineHeight + 10; - int startY = (this.height / 2) - (totalTextHeight / 2); - - graphics.drawCenteredString(this.font, Component.literal(title), this.width / 2, startY, 0xf94449); - - int bodyStartY = startY + lineHeight + 10; - for (int i = 0; i < wrappedLines.size(); i++) { - FormattedCharSequence line = wrappedLines.get(i); // Get each wrapped line - graphics.drawCenteredString(this.font, line, this.width / 2, bodyStartY + (i * lineHeight), 0xffffff); - } - } - } -} diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/LoadNotifier.java b/neoforge/src/main/java/com/vaporvee/loadsupport/LoadNotifier.java deleted file mode 100644 index c662cbd..0000000 --- a/neoforge/src/main/java/com/vaporvee/loadsupport/LoadNotifier.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.vaporvee.loadsupport; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.sounds.SoundEvents; - -public class LoadNotifier { - static boolean wasPlayed = false; - public static void notifySound(Minecraft client){ - if(LoadSupport.config.startSound && !wasPlayed) { - wasPlayed = true; - client.getSoundManager().play( - SimpleSoundInstance.forUI(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 1.0F) // Use any sound event you like - ); - } - } -} diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/LoadSupport.java b/neoforge/src/main/java/com/vaporvee/loadsupport/LoadSupport.java index aab3543..76b65e1 100644 --- a/neoforge/src/main/java/com/vaporvee/loadsupport/LoadSupport.java +++ b/neoforge/src/main/java/com/vaporvee/loadsupport/LoadSupport.java @@ -1,58 +1,21 @@ package com.vaporvee.loadsupport; -import me.shedaniel.autoconfig.AutoConfig; -import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.screens.AccessibilityOnboardingScreen; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.TitleScreen; -import net.neoforged.api.distmarker.Dist; -import org.slf4j.Logger; -import com.mojang.logging.LogUtils; - -import net.minecraft.client.Minecraft; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; +@Mod(Constants.MOD_ID) +public class LoadSupport { -// The value here should match an entry in the META-INF/neoforge.mods.toml file -@Mod(value = LoadSupport.MODID, dist = Dist.CLIENT) -public class LoadSupport -{ - public static LSConfig config; - private static float allocatedMemoryInGB; - // Define mod id in a common place for everything to reference - public static final String MODID = "loadsupport"; - // Directly reference a slf4j logger - static final Logger logger = LogUtils.getLogger(); + public LoadSupport(IEventBus eventBus) { + + // This method is invoked by the NeoForge mod loader when it is ready + // to load your mod. You can access NeoForge and Common code in this + // project. + + // Use NeoForge to bootstrap the Common mod. + Constants.LOG.info("Hello NeoForge world!"); + CommonClass.init(); - // The constructor for the mod class is the first code that is run when your mod is loaded. - // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically. - public LoadSupport(IEventBus modEventBus, ModContainer modContainer) - { - AutoConfig.register(LSConfig.class, Toml4jConfigSerializer::new); - config = AutoConfig.getConfigHolder(LSConfig.class).getConfig(); - allocatedMemoryInGB = Runtime.getRuntime().maxMemory() / 1073741824f; // Hardcoded value for GB - allocatedMemoryInGB = Math.round(allocatedMemoryInGB * 10) / 10f; - LoadSupport.logger.info(String.format("Allocated Memory: %.1f GB", allocatedMemoryInGB)); - ScreenEvents.BEFORE_INIT.register(LoadSupport::beforeWindowInit); } - - private static void beforeWindowInit(Minecraft minecraft, Screen screen, int i, int i1) { - if(config.minMemory > allocatedMemoryInGB){ - System.setProperty("java.awt.headless", "false"); // Hacky stupid thing but it works I guess... - LSWindow.createWindow(minecraft, screen); - } - if (screen instanceof TitleScreen || screen instanceof AccessibilityOnboardingScreen){ - LoadNotifier.notifySound(minecraft); - } - } - - public static String[] getWarningMessage(){ - return new String[]{config.errorTitle, config.errorDescription - .replace("{minMemory}", String.valueOf(config.minMemory)) - .replace("{currentMemory}", String.valueOf(allocatedMemoryInGB))}; - }; -} +} \ No newline at end of file diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java b/neoforge/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java new file mode 100644 index 0000000..6aea26b --- /dev/null +++ b/neoforge/src/main/java/com/vaporvee/loadsupport/mixin/MixinTitleScreen.java @@ -0,0 +1,20 @@ +package com.vaporvee.loadsupport.mixin; + +import com.vaporvee.loadsupport.Constants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class MixinTitleScreen { + + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + + Constants.LOG.info("This line is printed by an example mod mixin from NeoForge!"); + Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); + } +} \ No newline at end of file diff --git a/neoforge/src/main/java/com/vaporvee/loadsupport/platform/NeoForgePlatformHelper.java b/neoforge/src/main/java/com/vaporvee/loadsupport/platform/NeoForgePlatformHelper.java new file mode 100644 index 0000000..6d575e3 --- /dev/null +++ b/neoforge/src/main/java/com/vaporvee/loadsupport/platform/NeoForgePlatformHelper.java @@ -0,0 +1,33 @@ +package com.vaporvee.loadsupport.platform; + +import com.vaporvee.loadsupport.platform.services.IPlatformHelper; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLLoader; + +public class NeoForgePlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + + return "NeoForge"; + } + + @Override + public boolean isModLoaded(String modId) { + + return ModList.get().isLoaded(modId); + } + + @Override + public boolean isEnvServer() { + return FMLEnvironment.dist == Dist.DEDICATED_SERVER; + } + + @Override + public boolean isDevelopmentEnvironment() { + + return !FMLLoader.isProduction(); + } +} \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..b008f60 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,36 @@ +modLoader = "javafml" #mandatory +loaderVersion = "${neoforge_loader_version_range}" #mandatory +license = "${license}" # Review your options at https://choosealicense.com/. +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +[[mods]] #mandatory +modId = "${mod_id}" #mandatory +version = "${version}" #mandatory +displayName = "${mod_name}" #mandatory +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional (see https://docs.neoforged.net/docs/misc/updatechecker/) +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional (displayed in the mod UI) +logoFile="${mod_id}.png" #optional +credits="${credits}" #optional +authors = "${mod_author}" #optional +description = '''${description}''' #mandatory (Supports multiline text) +[[mixins]] +config = "${mod_id}.mixins.json" +[[mixins]] +config = "${mod_id}.neoforge.mixins.json" +[[dependencies.${mod_id}]] #optional +modId = "neoforge" #mandatory +type="required" #mandatory (Can be one of "required", "optional", "incompatible" or "discouraged") +versionRange = "[${neoforge_version},)" #mandatory +ordering = "NONE" # The order that this dependency should load in relation to your mod, required to be either 'BEFORE' or 'AFTER' if the dependency is not mandatory +side = "BOTH" # Side this dependency is applied on - 'BOTH', 'CLIENT' or 'SERVER' +[[dependencies.${mod_id}]] +modId = "minecraft" +type="required" #mandatory (Can be one of "required", "optional", "incompatible" or "discouraged") +versionRange = "${minecraft_version_range}" +ordering = "NONE" +side = "BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features.${mod_id}] +#openGLVersion="[3.2,)" diff --git a/neoforge/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper b/neoforge/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper new file mode 100644 index 0000000..e6f2ae8 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/com.vaporvee.loadsupport.platform.services.IPlatformHelper @@ -0,0 +1 @@ +com.vaporvee.loadsupport.platform.NeoForgePlatformHelper \ No newline at end of file diff --git a/neoforge/src/main/resources/loadsupport.neoforge.mixins.json b/neoforge/src/main/resources/loadsupport.neoforge.mixins.json new file mode 100644 index 0000000..efe5eb7 --- /dev/null +++ b/neoforge/src/main/resources/loadsupport.neoforge.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.vaporvee.loadsupport.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [], + "client": [ + "MixinTitleScreen" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/neoforge/src/main/templates/META-INF/neoforge.mods.toml b/neoforge/src/main/templates/META-INF/neoforge.mods.toml deleted file mode 100644 index 1b9f6e9..0000000 --- a/neoforge/src/main/templates/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,92 +0,0 @@ -# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml -modLoader="javafml" #mandatory - -# A version range to match for said mod loader - for regular FML @Mod it will be the FML version. This is currently 2. -loaderVersion="${loader_version_range}" #mandatory - -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license="${mod_license}" - -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional - -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory - -# The modid of the mod -modId="${mod_id}" #mandatory - -# The version number of the mod -version="${mod_version}" #mandatory - -# A display name for the mod -displayName="${mod_name}" #mandatory - -# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional - -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional - -# A file name (in the root of the mod JAR) containing a logo for display -#logoFile="examplemod.png" #optional - -# A text field displayed in the mod UI -#credits="" #optional - -# A text field displayed in the mod UI -authors="${mod_authors}" #optional - -# The description text for the mod (multi line!) (#mandatory) -description='''${mod_description}''' - -# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. -#[[mixins]] -#config="${mod_id}.mixins.json" - -# The [[accessTransformers]] block allows you to declare where your AT file is. -# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg -#[[accessTransformers]] -#file="META-INF/accesstransformer.cfg" - -# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json - -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.${mod_id}]] #optional - # the modid of the dependency - modId="neoforge" #mandatory - # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). - # 'required' requires the mod to exist, 'optional' does not - # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning - type="required" #mandatory - # Optional field describing why the dependency is required or why it is incompatible - # reason="..." - # The version range of the dependency - versionRange="${neo_version_range}" #mandatory - # An ordering relationship for the dependency. - # BEFORE - This mod is loaded BEFORE the dependency - # AFTER - This mod is loaded AFTER the dependency - ordering="NONE" - # Side this dependency is applied on - BOTH, CLIENT, or SERVER - side="BOTH" - -# Here's another dependency -[[dependencies.${mod_id}]] - modId="minecraft" - type="required" - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="${minecraft_version_range}" - ordering="NONE" - side="BOTH" - -# Features are specific properties of the game environment, that you may want to declare you require. This example declares -# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't -# stop your mod loading on the server for example. -#[features.${mod_id}] -#openGLVersion="[3.2,)" diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..1f60817 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,39 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + exclusiveContent { + forRepository { + maven { + name = 'Fabric' + url = uri('https://maven.fabricmc.net') + } + } + filter { + includeGroup('net.fabricmc') + includeGroup('fabric-loom') + } + } + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = uri('https://repo.spongepowered.org/repository/maven-public') + } + } + filter { + includeGroupAndSubgroups("org.spongepowered") + } + } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + +// This should match the folder name of the project, or else IDEA may complain (see https://youtrack.jetbrains.com/issue/IDEA-317606) +rootProject.name = 'Load Support' +include('common') +include('fabric') +include('neoforge') \ No newline at end of file