first
This commit is contained in:
@@ -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")
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
loader=neoforge
|
||||
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
+45
@@ -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"
|
||||
+1
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user