This commit is contained in:
2026-01-07 13:29:10 -05:00
commit 686541e399
1629 changed files with 317473 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
plugins {
`multiloader-loader`
id("net.neoforged.moddev")
}
val is120 = commonMod.minecraft_version.startsWith("1.20")
val targetBytecode = if (is120) 17 else 21
repositories {
mavenCentral()
maven("https://maven.architectury.dev/")
maven("https://maven.terraformersmc.com/releases/")
maven("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/")
maven("https://maven.blamejared.com/")
maven("https://maven.shedaniel.me/")
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
}
java.sourceCompatibility = JavaVersion.toVersion(targetBytecode)
java.targetCompatibility = JavaVersion.toVersion(targetBytecode)
afterEvaluate {
tasks.withType<JavaExec>().configureEach {
val launcher = javaToolchains.launcherFor {
languageVersion.set(JavaLanguageVersion.of(targetBytecode))
}
javaLauncher.set(null as org.gradle.jvm.toolchain.JavaLauncher?)
setExecutable(launcher.get().executablePath.asFile.absolutePath)
}
}
tasks.withType<JavaCompile>().configureEach {
options.release.set(targetBytecode)
options.encoding = "UTF-8"
}
neoForge {
enable {
version = commonMod.prop("neoforge_version")
}
}
dependencies {
// Architectury & GeckoLib
implementation("dev.architectury:architectury-neoforge:${commonMod.prop("architectury_version")}")
implementation("me.shedaniel.cloth:cloth-config-neoforge:${commonMod.prop("cloth_config_version_1_21_1")}")
implementation("software.bernie.geckolib:geckolib-neoforge-${commonMod.minecraft_version}:${commonMod.prop("geckolib_version")}")
// JEI (NeoForge)
compileOnly("mezz.jei:jei-${commonMod.minecraft_version}-common-api:${commonMod.prop("jei_version")}")
compileOnly("mezz.jei:jei-${commonMod.minecraft_version}-neoforge-api:${commonMod.prop("jei_version")}")
runtimeOnly("mezz.jei:jei-${commonMod.minecraft_version}-neoforge:${commonMod.prop("jei_version")}")
}
neoForge {
val at = project.file("build/resources/main/META-INF/accesstransformer.cfg");
accessTransformers.from(at.absolutePath)
validateAccessTransformers = true
runs {
register("client") {
client()
ideName = "NeoForge Client (${project.path})"
}
if (stonecutter.eval(stonecutter.current.version, ">=1.21.4")) {
register("clientData") {
clientData()
ideName = "NeoForge Client Data (${project.path})"
}
register("serverData") {
serverData()
ideName = "NeoForge Server Data (${project.path})"
}
} else {
register("data") {
data()
ideName = "NeoForge Data (${project.path})"
}
}
register("server") {
server()
ideName = "NeoForge Server (${project.path})"
}
}
parchment {
commonMod.propOrNull("parchment_mappings")?.let {
mappingsVersion = it
minecraftVersion = if (it != "") commonMod.minecraft_version else ""
}
}
mods {
register(commonMod.id) {
sourceSet(sourceSets.main.get())
}
}
}
sourceSets.main {
resources.srcDir("src/generated/resources")
}
tasks {
processResources {
exclude("${mod.id}.accesswidener")
val atFile = project(":common").file("src/main/resources/accesstransformers/accesstransformer-${commonMod.minecraft_version}.cfg")
from(atFile.parentFile) {
include(atFile.name)
rename(atFile.name, "META-INF/accesstransformer.cfg")
into("")
}
inputs.property("targetBytecode", targetBytecode)
filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml")) {
expand(mapOf(
"architectury_version" to commonMod.prop("architectury_version"),
"geckolib_version" to commonMod.prop("geckolib_version"),
"cloth_config_version_1_21_1" to commonMod.prop("cloth_config_version_1_21_1"),
"minecraft_version" to commonMod.minecraft_version,
"neoforge_version" to commonMod.prop("neoforge_version"),
"mod_id" to commonMod.id,
"mod_name" to commonMod.name,
"mod_license" to commonMod.license,
"mod_version" to commonMod.version,
"mod_authors" to commonMod.author,
"mod_description" to commonMod.description
))
filter { line ->
if (targetBytecode == 21) {
line.replace("[17,)", "[21,)")
} else {
line
}
}
}
}
}
tasks.named("createMinecraftArtifacts") {
dependsOn(":neoforge:${commonMod.propOrNull("minecraft_version")}:processResources")
}
+1
View File
@@ -0,0 +1 @@
loader=neoforge
+125
View File
@@ -0,0 +1,125 @@
plugins {
`multiloader-loader`
id ("net.neoforged.gradle.userdev") version "7.1.4"
}
repositories {
mavenCentral()
maven("https://maven.architectury.dev/")
maven("https://maven.terraformersmc.com/releases/")
maven("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/")
maven("https://maven.blamejared.com/")
}
println(
"Java: ${providers.systemProperty("java.version").get()}, " +
"JVM: ${providers.systemProperty("java.vm.version").get()} (${
providers.systemProperty("java.vendor").get()
}), " +
"Arch: ${providers.systemProperty("os.arch").get()}"
)
//minecraft.accessTransformers.file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg')
//minecraft.accessTransformers.entry public net.minecraft.client.Minecraft textureManager # textureManager
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
runs {
// applies to all the run configs below
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
systemProperty("forge.logging.console.level", "debug")
modSource(project.sourceSets.main.get())
}
register("client") {
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
systemProperty("neoforge.enabledGameTestNamespaces", commonMod.id)
}
register("server") {
systemProperty("neoforge.enabledGameTestNamespaces", commonMod.id)
argument("--nogui")
}
// 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.
register("gameTestServer") {
systemProperty("neoforge.enabledGameTestNamespaces", commonMod.id)
}
register("data") {
// example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
// workingDirectory project.file('run-data')
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
arguments.addAll("--mod", commonMod.id, "--all", "--output", file("src/generated/resources/").getAbsolutePath(), "--existing", file("src/main/resources/").getAbsolutePath())
}
}
// 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 {
implementation("net.neoforged:neoforge:${commonMod.prop("neoforge_version")}")
// Architectury & GeckoLib
implementation("dev.architectury:architectury-neoforge:${commonMod.prop("architectury_version")}")
implementation("software.bernie.geckolib:geckolib-neoforge-${commonMod.minecraft_version}:${commonMod.prop("geckolib_version")}")
// JEI (NeoForge)
compileOnly("mezz.jei:jei-${commonMod.minecraft_version}-common-api:${commonMod.prop("jei_version")}")
compileOnly("mezz.jei:jei-${commonMod.minecraft_version}-neoforge-api:${commonMod.prop("jei_version")}")
runtimeOnly("mezz.jei:jei-${commonMod.minecraft_version}-neoforge:${commonMod.prop("jei_version")}")
}
tasks.withType(JavaCompile::class).configureEach {
options.encoding = "UTF-8" // Use the UTF-8 charset for Java compilation
}
tasks {
processResources {
exclude("${mod.id}.accesswidener")
}
register<Copy>("copyAT") {
val atFile =
project(":common").file("src/main/resources/accesstransformers/accesstransformer-${commonMod.minecraft_version}.cfg")
from(atFile) {
rename("accesstransformer-${commonMod.minecraft_version}.cfg", "accesstransformer.cfg")
}
setDuplicatesStrategy(DuplicatesStrategy.INHERIT)
into("src/main/resources/META-INF")
mustRunAfter(common.project.tasks.getByName("stonecutterMerge"))
}
}
tasks.named("stonecutterPrepare") {
finalizedBy(tasks.named("copyAT"))
}
sourceSets.forEach {
val dir = layout.buildDirectory.dir("sourcesSets/$it.name")
it.output.setResourcesDir(dir)
it.java.destinationDirectory = dir
}
@@ -0,0 +1,23 @@
package net.cmr.jurassicrevived;
import net.cmr.jurassicrevived.client.config.JRClothConfigScreens;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import java.util.function.Supplier;
@Mod(Constants.MOD_ID)
public class JRMod {
public JRMod(IEventBus eventBus) {
Constants.LOG.info("Hello NeoForge world!");
CommonClass.init();
ModLoadingContext.get().getActiveContainer().registerExtensionPoint(
IConfigScreenFactory.class,
(Supplier<IConfigScreenFactory>) () -> (client, parent) -> JRClothConfigScreens.create(parent)
);
}
}
@@ -0,0 +1,45 @@
package net.cmr.jurassicrevived.client.config;
import me.shedaniel.clothconfig2.api.ConfigBuilder;
import me.shedaniel.clothconfig2.api.ConfigCategory;
import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
import net.cmr.jurassicrevived.config.JRConfig;
import net.cmr.jurassicrevived.config.JRConfigManager;
import net.cmr.jurassicrevived.platform.Services;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
public final class JRClothConfigScreens {
private JRClothConfigScreens() {}
public static Screen create(Screen parent) {
JRConfig cfg = JRConfigManager.get();
ConfigBuilder builder = ConfigBuilder.create()
.setParentScreen(parent)
.setTitle(Component.literal("Jurassic Revived Config"));
ConfigCategory general = builder.getOrCreateCategory(Component.literal("General"));
ConfigEntryBuilder eb = builder.entryBuilder();
general.addEntry(
eb.startBooleanToggle(Component.literal("Enable Dinosaurs"), cfg.enableDinosaurs)
.setDefaultValue(true)
.setSaveConsumer(v -> cfg.enableDinosaurs = v)
.build()
);
general.addEntry(
eb.startIntField(Component.literal("Spawn Weight"), cfg.spawnWeight)
.setDefaultValue(10)
.setMin(0)
.setMax(1000)
.setSaveConsumer(v -> cfg.spawnWeight = v)
.build()
);
builder.setSavingRunnable(() -> JRConfigManager.save(Services.PLATFORM.getConfigDir()));
return builder.build();
}
}
@@ -0,0 +1,21 @@
package net.cmr.jurassicrevived.mixin;
import net.cmr.jurassicrevived.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());
}
}
@@ -0,0 +1,39 @@
package net.cmr.jurassicrevived.platform;
import net.cmr.jurassicrevived.platform.services.IPlatformHelper;
import net.neoforged.fml.ModList;
import net.neoforged.fml.loading.FMLLoader;
import net.neoforged.fml.loading.FMLPaths;
import java.nio.file.Path;
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 isDevelopmentEnvironment() {
//? if >=1.21.9 {
/*return !FMLLoader.getCurrent().isProduction();
*///?} else {
return !FMLLoader.isProduction();
//?}
}
@Override
public Path getConfigDir() {
return FMLPaths.CONFIGDIR.get();
}
}
@@ -0,0 +1,56 @@
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)
[features.${mod_id}]
javaVersion = "[${java_version},)"
[[mixins]]
config = "${mod_id}.mixins.json"
[[mixins]]
config = "${mod_id}.neoforge.mixins.json"
[[dependencies.${ mod_id }]] #optional
modId = "neoforge"
type = "required"
versionRange = "${neoforge_version_range}"
ordering = "NONE"
side = "BOTH"
[[dependencies.${ mod_id }]]
modId = "minecraft"
type = "required"
versionRange = "${minecraft_version_range}"
ordering = "NONE"
side = "BOTH"
[[dependencies.${ mod_id }]]
modId="architectury"
mandatory=true
versionRange="[${architectury_version},)"
ordering="NONE"
side="BOTH"
[[dependencies.${ mod_id }]]
modId="cloth_config"
mandatory=true
versionRange="[${cloth_config_version_1_21_1},)"
ordering="NONE"
side="CLIENT"
[[dependencies.${ mod_id }]]
modId="geckolib"
mandatory=true
versionRange="[${geckolib_version},)"
ordering="NONE"
side="BOTH"
@@ -0,0 +1 @@
net.cmr.jurassicrevived.platform.NeoForgePlatformHelper
@@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "net.cmr.jurassicrevived.mixin",
"compatibilityLevel": "JAVA_21",
"mixins": [],
"client": [
"MixinTitleScreen"
],
"server": [],
"injectors": {
"defaultRequire": 1
}
}