diff --git a/build.gradle b/build.gradle index b7720023..4396fe69 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,25 @@ -plugins { - // see https://fabricmc.net/develop/ for new versions - id 'net.fabricmc.fabric-loom-remap' version '1.16-SNAPSHOT' apply false - // see https://projects.neoforged.net/neoforged/moddevgradle for new versions - id 'net.neoforged.moddev' version '2.0.140' apply false - // see // https://github.com/modmuss50/mod-publish-plugin for new versions - id "me.modmuss50.mod-publish-plugin" version "1.1.0" apply false - - id 'com.diffplug.spotless' version '7.2.1' - id "checkstyle" -} - -allprojects { - apply plugin: 'com.diffplug.spotless' - - spotless { - format 'misc', { - target '*.gradle', '.gitattributes', '.gitignore' - - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - } -} +plugins { + // see https://fabricmc.net/develop/ for new versions + id 'net.fabricmc.fabric-loom-remap' version '1.16-SNAPSHOT' apply false + // see https://projects.neoforged.net/neoforged/moddevgradle for new versions + id 'net.neoforged.moddev' version '2.0.140' apply false + // see // https://github.com/modmuss50/mod-publish-plugin for new versions + id "me.modmuss50.mod-publish-plugin" version "1.1.0" apply false + + id 'com.diffplug.spotless' version '7.2.1' + id "checkstyle" +} + +allprojects { + apply plugin: 'com.diffplug.spotless' + + spotless { + format 'misc', { + target '*.gradle', '.gitattributes', '.gitignore' + + trimTrailingWhitespace() + leadingTabsToSpaces() + endWithNewline() + } + } +} diff --git a/common/build.gradle b/common/build.gradle index 51aa461c..3241000a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,261 +1,261 @@ -import org.apache.tools.ant.taskdefs.condition.Os -import net.jpountz.lz4.LZ4FrameOutputStream - -import java.nio.file.Files - -buildscript { - dependencies { - classpath 'at.yawk.lz4:lz4-java:1.11.0' - } -} - -plugins { - id 'multiloader-common' - id 'net.neoforged.moddev' -} - -def mac(arch) { - [triple: "${arch}-apple-darwin", suffix: "", arch: arch, os: "macos", ext: "dylib", lib: true] -} - -def linux(arch) { - [triple: "${arch}-unknown-linux-gnu", suffix: ".2.17", arch: arch, os: "linux", ext: "so", lib: true] -} - -def freebsd(arch) { - [triple: "${arch}-unknown-freebsd", suffix: "", arch: arch, os: "freebsd", ext: "so", lib: true] -} - -def windows(arch) { - [triple: "${arch}-pc-windows-msvc", suffix: "", arch: arch, os: "windows", ext: "dll", lib: false] -} - -def supportedTargets = [ - mac("x86_64"), - mac("aarch64"), - linux("x86_64"), - linux("aarch64"), - windows("x86_64"), - windows("aarch64"), -// freebsd("x86_64"), - // freebsd("aarch64"), -] -def pinnedRustVersion = 'nightly-2026-01-29' -def rustRootDir = file("src/main/rust") -def rustProjectDir = file("$rustRootDir/rapier") -def nativesDir = file("src/main/resources/natives/sable_rapier") -def cargoCacheDir = project.layout.buildDirectory.file("cargo").get().asFile -def docker = Os.isFamily(Os.FAMILY_MAC) ? "/usr/local/bin/docker" : "docker" -def xWinImage = 'sable-build-xwin' -def zigbuildImage = 'sable-build-zigbuild' - -def baseDockerCommand = [ - docker, - 'run', - '--rm', - '-v', - "$rustRootDir:/io", - '-v', - "$cargoCacheDir/git:/usr/local/cargo/git", - '-v', - "$cargoCacheDir/registry:/usr/local/cargo/registry", - '-w', - '/io/rapier', -] -project.ext.zigbuildCargo = [baseDockerCommand, zigbuildImage, 'cargo'].flatten() -project.ext.xWinCargo = [baseDockerCommand, xWinImage, 'cargo'].flatten() - -tasks.register('createContainersDirectory') { - doLast { - if (!cargoCacheDir.exists()) { - cargoCacheDir.mkdirs() - } - } -} - - -tasks.register('buildZigbuildImage', Exec) { - group = 'rust' - workingDir rustRootDir - commandLine docker, 'build', '-t', zigbuildImage, 'container/zigbuild', '--build-arg', "RUST_VERSION=${pinnedRustVersion}" - dependsOn createContainersDirectory -} -tasks.register('buildXWinImage', Exec) { - group = 'rust' - workingDir rustRootDir - commandLine docker, 'build', '-t', xWinImage, 'container/xwin', '--build-arg', "RUST_VERSION=${pinnedRustVersion}" - dependsOn createContainersDirectory -} - -tasks.register('buildImages') { - group = 'rust' - dependsOn buildZigbuildImage, buildXWinImage -} - -tasks.register('cleanRust', Exec) { - group = 'rust' - workingDir rustProjectDir - commandLine project.ext.zigbuildCargo - // only need to use zigbuild cargo since both containers share the same target folder - args 'clean' - dependsOn createContainersDirectory -} - -def compileRustTaskName = { target -> - "compileRust-${target.os}-${target.arch}" -} - -def commandLineForTarget(target) { - if (target.triple.contains('msvc')) { - [project.ext.xWinCargo, 'xwin', 'build', '--target', target.triple + target.suffix].flatten() - // support meme platforms, this does nothing by default because the target is disabled - } else if (target.triple == 'aarch64-unknown-freebsd') { - [project.ext.zigbuildCargo, 'zigbuild', '-Z', 'build-std', '--target', target.triple + target.suffix].flatten() - } else { - [project.ext.zigbuildCargo, 'zigbuild', '--target', target.triple + target.suffix].flatten() - } -} - -def nativesNameForTarget(target) { - "sable_rapier_${target.arch}_${target.os}.${target.ext}" -} - -supportedTargets.forEach { target -> - tasks.register(compileRustTaskName(target), Exec) { - group = 'rust' - workingDir rustProjectDir - description = "Cross-compiles natives for the ${target.triple} target" - def commands= commandLineForTarget(target) - commands.add('--release') - commandLine = commands - } -} - -tasks.register("compileRustDev", Exec) { - group = 'rust' - workingDir rustProjectDir - description = "Compiles debug natives" - commandLine = [project.ext.zigbuildCargo, 'zigbuild'].flatten() -} - -tasks.register('buildRustNatives') { - group = 'build' - description = 'Compiles all Rust natives and moves them to resources.' - - dependsOn = supportedTargets.stream().map(compileRustTaskName).collect() - finalizedBy copyRustNatives -} - -tasks.register('buildRustNativesDev') { - group = 'build' - description = 'Compiles all Rust natives and moves them to resources.' - - dependsOn compileRustDev - finalizedBy copyRustNativesDev -} - -tasks.register('copyRustNatives', Copy) { - group = 'rust' - into nativesDir - mustRunAfter(buildRustNatives) - - supportedTargets.forEach { target -> - from(file("$rustRootDir/target/${target.triple}/release/${if (target.lib) { "lib" } else { "" }}sable_rapier.${target.ext}")) { - rename { nativesNameForTarget(target) } - } - } - finalizedBy packRustNatives -} - -tasks.register('copyRustNativesDev', Copy) { - group = 'rust' - into nativesDir - mustRunAfter(buildRustNativesDev) - - supportedTargets.forEach { target -> - var library = file("$rustRootDir/target/debug/${if (target.lib) { "lib" } else { "" }}sable_rapier.${target.ext}") - if (!library.exists()) return - - from(library) { - rename { nativesNameForTarget(target) } - } - } - finalizedBy packRustNatives -} -tasks.register('packRustNatives', Zip) { - group = 'rust' - archiveFile.set file("${nativesDir}/sable_rapier_binaries.zip.l4z") - entryCompression = ZipEntryCompression.STORED - into nativesDir - - mustRunAfter copyRustNatives, copyRustNativesDev - supportedTargets.forEach { target -> - var f = nativesNameForTarget(target) - // No, you can't use rename here in case you were wondering. - from(file("${nativesDir}/${f}")) { eachFile { setPath f } } - } - doLast { - byte[] bytes = Files.readAllBytes(getArchiveFile().get().asFile.toPath()) - try (var f = new FileOutputStream(getArchiveFile().get().asFile)) { - try (var x = new LZ4FrameOutputStream(f, LZ4FrameOutputStream.BLOCKSIZE.SIZE_4MB, bytes.length, LZ4FrameOutputStream.FLG.Bits.BLOCK_INDEPENDENCE)) { - x.write(bytes) - } - } - supportedTargets.forEach { t -> - delete(file("${nativesDir}/${nativesNameForTarget(t)}")) - } - } -} - -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 - } -} - -configurations { - commonJava { - canBeResolved = false - canBeConsumed = true - } - commonResources { - canBeResolved = false - canBeConsumed = true - } -} - -artifacts { - commonJava sourceSets.main.java.sourceDirectories.singleFile - commonResources sourceSets.main.resources.sourceDirectories.singleFile -} - -dependencies { - compileOnly "net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7" - - // fabric and neoforge both bundle mixinextras, so it is safe to use it in common - compileOnly "io.github.llamalad7:mixinextras-common:0.5.3" - annotationProcessor "io.github.llamalad7:mixinextras-common:0.5.3" - - implementation "org.apache.maven:maven-artifact:3.8.5" - - api "dev.ryanhcode.sable-companion:sable-companion-common-$minecraft_version:$sable_companion_version" - - implementation("foundry.veil:veil-common-${project.minecraft_version}:${project.veil_version}") { - exclude group: "maven.modrinth" - } - compileOnly("foundry.imguimc:imguimc-common-${project.minecraft_version}:${project.imguimc_version}") - - compileOnly("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${forgeconfigapiport_version}") { - transitive = false - } - - implementation "fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:${forgeconfigapiport_version}" - //source: https://github.com/Fuzss/forgeconfigapiport -} +import org.apache.tools.ant.taskdefs.condition.Os +import net.jpountz.lz4.LZ4FrameOutputStream + +import java.nio.file.Files + +buildscript { + dependencies { + classpath 'at.yawk.lz4:lz4-java:1.11.0' + } +} + +plugins { + id 'multiloader-common' + id 'net.neoforged.moddev' +} + +def mac(arch) { + [triple: "${arch}-apple-darwin", suffix: "", arch: arch, os: "macos", ext: "dylib", lib: true] +} + +def linux(arch) { + [triple: "${arch}-unknown-linux-gnu", suffix: ".2.17", arch: arch, os: "linux", ext: "so", lib: true] +} + +def freebsd(arch) { + [triple: "${arch}-unknown-freebsd", suffix: "", arch: arch, os: "freebsd", ext: "so", lib: true] +} + +def windows(arch) { + [triple: "${arch}-pc-windows-msvc", suffix: "", arch: arch, os: "windows", ext: "dll", lib: false] +} + +def supportedTargets = [ + mac("x86_64"), + mac("aarch64"), + linux("x86_64"), + linux("aarch64"), + windows("x86_64"), + windows("aarch64"), +// freebsd("x86_64"), + // freebsd("aarch64"), +] +def pinnedRustVersion = 'nightly-2026-01-29' +def rustRootDir = file("src/main/rust") +def rustProjectDir = file("$rustRootDir/rapier") +def nativesDir = file("src/main/resources/natives/sable_rapier") +def cargoCacheDir = project.layout.buildDirectory.file("cargo").get().asFile +def docker = Os.isFamily(Os.FAMILY_MAC) ? "/usr/local/bin/docker" : "docker" +def xWinImage = 'sable-build-xwin' +def zigbuildImage = 'sable-build-zigbuild' + +def baseDockerCommand = [ + docker, + 'run', + '--rm', + '-v', + "$rustRootDir:/io", + '-v', + "$cargoCacheDir/git:/usr/local/cargo/git", + '-v', + "$cargoCacheDir/registry:/usr/local/cargo/registry", + '-w', + '/io/rapier', +] +project.ext.zigbuildCargo = [baseDockerCommand, zigbuildImage, 'cargo'].flatten() +project.ext.xWinCargo = [baseDockerCommand, xWinImage, 'cargo'].flatten() + +tasks.register('createContainersDirectory') { + doLast { + if (!cargoCacheDir.exists()) { + cargoCacheDir.mkdirs() + } + } +} + + +tasks.register('buildZigbuildImage', Exec) { + group = 'rust' + workingDir rustRootDir + commandLine docker, 'build', '-t', zigbuildImage, 'container/zigbuild', '--build-arg', "RUST_VERSION=${pinnedRustVersion}" + dependsOn createContainersDirectory +} +tasks.register('buildXWinImage', Exec) { + group = 'rust' + workingDir rustRootDir + commandLine docker, 'build', '-t', xWinImage, 'container/xwin', '--build-arg', "RUST_VERSION=${pinnedRustVersion}" + dependsOn createContainersDirectory +} + +tasks.register('buildImages') { + group = 'rust' + dependsOn buildZigbuildImage, buildXWinImage +} + +tasks.register('cleanRust', Exec) { + group = 'rust' + workingDir rustProjectDir + commandLine project.ext.zigbuildCargo + // only need to use zigbuild cargo since both containers share the same target folder + args 'clean' + dependsOn createContainersDirectory +} + +def compileRustTaskName = { target -> + "compileRust-${target.os}-${target.arch}" +} + +def commandLineForTarget(target) { + if (target.triple.contains('msvc')) { + [project.ext.xWinCargo, 'xwin', 'build', '--target', target.triple + target.suffix].flatten() + // support meme platforms, this does nothing by default because the target is disabled + } else if (target.triple == 'aarch64-unknown-freebsd') { + [project.ext.zigbuildCargo, 'zigbuild', '-Z', 'build-std', '--target', target.triple + target.suffix].flatten() + } else { + [project.ext.zigbuildCargo, 'zigbuild', '--target', target.triple + target.suffix].flatten() + } +} + +def nativesNameForTarget(target) { + "sable_rapier_${target.arch}_${target.os}.${target.ext}" +} + +supportedTargets.forEach { target -> + tasks.register(compileRustTaskName(target), Exec) { + group = 'rust' + workingDir rustProjectDir + description = "Cross-compiles natives for the ${target.triple} target" + def commands= commandLineForTarget(target) + commands.add('--release') + commandLine = commands + } +} + +tasks.register("compileRustDev", Exec) { + group = 'rust' + workingDir rustProjectDir + description = "Compiles debug natives" + commandLine = [project.ext.zigbuildCargo, 'zigbuild'].flatten() +} + +tasks.register('buildRustNatives') { + group = 'build' + description = 'Compiles all Rust natives and moves them to resources.' + + dependsOn = supportedTargets.stream().map(compileRustTaskName).collect() + finalizedBy copyRustNatives +} + +tasks.register('buildRustNativesDev') { + group = 'build' + description = 'Compiles all Rust natives and moves them to resources.' + + dependsOn compileRustDev + finalizedBy copyRustNativesDev +} + +tasks.register('copyRustNatives', Copy) { + group = 'rust' + into nativesDir + mustRunAfter(buildRustNatives) + + supportedTargets.forEach { target -> + from(file("$rustRootDir/target/${target.triple}/release/${if (target.lib) { "lib" } else { "" }}sable_rapier.${target.ext}")) { + rename { nativesNameForTarget(target) } + } + } + finalizedBy packRustNatives +} + +tasks.register('copyRustNativesDev', Copy) { + group = 'rust' + into nativesDir + mustRunAfter(buildRustNativesDev) + + supportedTargets.forEach { target -> + var library = file("$rustRootDir/target/debug/${if (target.lib) { "lib" } else { "" }}sable_rapier.${target.ext}") + if (!library.exists()) return + + from(library) { + rename { nativesNameForTarget(target) } + } + } + finalizedBy packRustNatives +} +tasks.register('packRustNatives', Zip) { + group = 'rust' + archiveFile.set file("${nativesDir}/sable_rapier_binaries.zip.l4z") + entryCompression = ZipEntryCompression.STORED + into nativesDir + + mustRunAfter copyRustNatives, copyRustNativesDev + supportedTargets.forEach { target -> + var f = nativesNameForTarget(target) + // No, you can't use rename here in case you were wondering. + from(file("${nativesDir}/${f}")) { eachFile { setPath f } } + } + doLast { + byte[] bytes = Files.readAllBytes(getArchiveFile().get().asFile.toPath()) + try (var f = new FileOutputStream(getArchiveFile().get().asFile)) { + try (var x = new LZ4FrameOutputStream(f, LZ4FrameOutputStream.BLOCKSIZE.SIZE_4MB, bytes.length, LZ4FrameOutputStream.FLG.Bits.BLOCK_INDEPENDENCE)) { + x.write(bytes) + } + } + supportedTargets.forEach { t -> + delete(file("${nativesDir}/${nativesNameForTarget(t)}")) + } + } +} + +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 + } +} + +configurations { + commonJava { + canBeResolved = false + canBeConsumed = true + } + commonResources { + canBeResolved = false + canBeConsumed = true + } +} + +artifacts { + commonJava sourceSets.main.java.sourceDirectories.singleFile + commonResources sourceSets.main.resources.sourceDirectories.singleFile +} + +dependencies { + compileOnly "net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7" + + // fabric and neoforge both bundle mixinextras, so it is safe to use it in common + compileOnly "io.github.llamalad7:mixinextras-common:0.5.3" + annotationProcessor "io.github.llamalad7:mixinextras-common:0.5.3" + + implementation "org.apache.maven:maven-artifact:3.8.5" + + api "dev.ryanhcode.sable-companion:sable-companion-common-$minecraft_version:$sable_companion_version" + + implementation("foundry.veil:veil-common-${project.minecraft_version}:${project.veil_version}") { + exclude group: "maven.modrinth" + } + compileOnly("foundry.imguimc:imguimc-common-${project.minecraft_version}:${project.imguimc_version}") + + compileOnly("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${forgeconfigapiport_version}") { + transitive = false + } + + implementation "fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:${forgeconfigapiport_version}" + //source: https://github.com/Fuzss/forgeconfigapiport +} diff --git a/fabric/build.gradle b/fabric/build.gradle index 9a743453..0958870b 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,69 +1,69 @@ -plugins { - id 'me.modmuss50.mod-publish-plugin' - id 'net.fabricmc.fabric-loom-remap' - id 'multiloader-loader' -} - -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 fabricApi.module("fabric-command-api-v2", project.fabric_version) - modImplementation fabricApi.module("fabric-lifecycle-events-v1", project.fabric_version) - modImplementation fabricApi.module("fabric-resource-loader-v0", project.fabric_version) - modImplementation fabricApi.module("fabric-convention-tags-v2", project.fabric_version) - - include(implementation("org.apache.maven:maven-artifact:3.8.5")) - - include(modApi("dev.ryanhcode.sable-companion:sable-companion-fabric-$minecraft_version:$sable_companion_version")) - - modCompileOnly "net.caffeinemc:sodium-fabric:${rootProject.sodium_version}" - modCompileOnly "maven.modrinth:distanthorizons:${rootProject.distant_horizons_version}" - modCompileOnly "maven.modrinth:sodium-extras:fabric-${minecraft_version}-$sodiumextras_version" - - include(modApi("foundry.veil:veil-fabric-${project.minecraft_version}:${project.veil_version}")) - modCompileOnly("foundry.imguimc:imguimc-fabric-${project.minecraft_version}:${project.imguimc_version}") - - include(modApi("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${forgeconfigapiport_version}")) //source: https://github.com/Fuzss/forgeconfigapiport-fabric -} - -loom { - def aw = project(":common").file("src/main/resources/${mod_id}.accesswidener") - if (aw.exists()) { - accessWidenerPath.set(aw) - } - runs { - def client = client { - client() - setConfigName("Fabric Client") - ideConfigGenerated(true) - runDir("runs/client") - } - def server = server { - server() - setConfigName("Fabric Server") - ideConfigGenerated(true) - runDir("runs/server") - } - - clientMixinExport { - inherit(client) - setConfigName(configName + " | Mixin Export") - vmArg("-Dmixin.debug.export=true") - } - serverMixinExport { - inherit(server) - setConfigName(configName + " | Mixin Export") - vmArg("-Dmixin.debug.export=true") - } - } -} - -repositories { - mavenLocal() - maven { url = "https://maven.quiltmc.org/repository/release" } -} +plugins { + id 'me.modmuss50.mod-publish-plugin' + id 'net.fabricmc.fabric-loom-remap' + id 'multiloader-loader' +} + +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 fabricApi.module("fabric-command-api-v2", project.fabric_version) + modImplementation fabricApi.module("fabric-lifecycle-events-v1", project.fabric_version) + modImplementation fabricApi.module("fabric-resource-loader-v0", project.fabric_version) + modImplementation fabricApi.module("fabric-convention-tags-v2", project.fabric_version) + + include(implementation("org.apache.maven:maven-artifact:3.8.5")) + + include(modApi("dev.ryanhcode.sable-companion:sable-companion-fabric-$minecraft_version:$sable_companion_version")) + + modCompileOnly "net.caffeinemc:sodium-fabric:${rootProject.sodium_version}" + modCompileOnly "maven.modrinth:distanthorizons:${rootProject.distant_horizons_version}" + modCompileOnly "maven.modrinth:sodium-extras:fabric-${minecraft_version}-$sodiumextras_version" + + include(modApi("foundry.veil:veil-fabric-${project.minecraft_version}:${project.veil_version}")) + modCompileOnly("foundry.imguimc:imguimc-fabric-${project.minecraft_version}:${project.imguimc_version}") + + include(modApi("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:${forgeconfigapiport_version}")) //source: https://github.com/Fuzss/forgeconfigapiport-fabric +} + +loom { + def aw = project(":common").file("src/main/resources/${mod_id}.accesswidener") + if (aw.exists()) { + accessWidenerPath.set(aw) + } + runs { + def client = client { + client() + setConfigName("Fabric Client") + ideConfigGenerated(true) + runDir("runs/client") + } + def server = server { + server() + setConfigName("Fabric Server") + ideConfigGenerated(true) + runDir("runs/server") + } + + clientMixinExport { + inherit(client) + setConfigName(configName + " | Mixin Export") + vmArg("-Dmixin.debug.export=true") + } + serverMixinExport { + inherit(server) + setConfigName(configName + " | Mixin Export") + vmArg("-Dmixin.debug.export=true") + } + } +} + +repositories { + mavenLocal() + maven { url = "https://maven.quiltmc.org/repository/release" } +} diff --git a/neoforge/build.gradle b/neoforge/build.gradle index dedc829a..4b6cf11d 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,98 +1,98 @@ -plugins { - id 'me.modmuss50.mod-publish-plugin' - 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.toString()) - ideName = "NeoForge ${it.name.capitalize()} (${project.path})" // Unify the run config names with fabric - } - client { - client() - } - server { - server() - } - gameTest { - type = "gameTestServer" - gameDirectory = project.file("build/gametest") - } - - clientMixinExport { - client() - ideName = "NeoForge Client | Mixin Export (${project.path})" - systemProperty("mixin.debug.export", "true") - } - serverMixinExport { - server() - ideName = "NeoForge Server | Mixin Export (${project.path})" - systemProperty("mixin.debug.export", "true") - } - } - mods { - "${mod_id}" { - sourceSet sourceSets.main - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenLocal() - - maven { - name = 'NeoForged' - url = 'https://maven.neoforged.net/releases' - } - - maven { - name = "Mortuusars Github Maven" - url = "https://raw.githubusercontent.com/mortuusars/resources/main/maven/" - } -} - -dependencies { - jarJar(api("dev.ryanhcode.sable-companion:sable-companion-common-${project.minecraft_version}:[${project.sable_companion_version},)")) { - version { - prefer project.sable_companion_version - } - } - - compileOnly "maven.modrinth:distanthorizons:$rootProject.distant_horizons_version" - compileOnly "maven.modrinth:backpacks-for-dummies:$rootProject.backpacks_for_dummies_version" - - implementation("com.simibubi.create:create-${minecraft_version}:${create_version}") { transitive = false } - implementation("net.createmod.ponder:ponder-neoforge:${ponder_version}+mc${minecraft_version}") - compileOnly("dev.engine-room.flywheel:flywheel-neoforge-api-${minecraft_version}:${flywheel_version}") - implementation("dev.engine-room.flywheel:flywheel-neoforge-${minecraft_version}:${flywheel_version}") - implementation("com.tterrag.registrate:Registrate:${registrate_version}") - - compileOnly("maven.modrinth:protomanlys-weather:${pmweather_version}") - compileOnly("io.github.mortuusars.exposure:exposure-${minecraft_version}-neoforge:${exposure_version}") { transitive = false } - compileOnly("maven.modrinth:jade:${project.jade_version}+neoforge") { transitive = false } - compileOnly("maven.modrinth:jade-addons-forge:${project.jade_addons_version}+neoforge") { transitive = false } - - compileOnly "net.caffeinemc:sodium-neoforge-mod:${sodium_version}" - compileOnly("maven.modrinth:iris:$iris_version") { transitive = false } - compileOnly("maven.modrinth:sodium-extras:neoforge-${minecraft_version}-$sodiumextras_version") { transitive = false } - - jarJar(api("foundry.veil:veil-neoforge-${project.minecraft_version}:${project.veil_version}") { - exclude group: "maven.modrinth" - exclude group: "me.fallenbreath" - }) - compileOnly("foundry.imguimc:imguimc-neoforge-${project.minecraft_version}:${project.imguimc_version}") -} +plugins { + id 'me.modmuss50.mod-publish-plugin' + 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.toString()) + ideName = "NeoForge ${it.name.capitalize()} (${project.path})" // Unify the run config names with fabric + } + client { + client() + } + server { + server() + } + gameTest { + type = "gameTestServer" + gameDirectory = project.file("build/gametest") + } + + clientMixinExport { + client() + ideName = "NeoForge Client | Mixin Export (${project.path})" + systemProperty("mixin.debug.export", "true") + } + serverMixinExport { + server() + ideName = "NeoForge Server | Mixin Export (${project.path})" + systemProperty("mixin.debug.export", "true") + } + } + mods { + "${mod_id}" { + sourceSet sourceSets.main + } + } +} + +sourceSets.main.resources { srcDir 'src/generated/resources' } + +repositories { + mavenLocal() + + maven { + name = 'NeoForged' + url = 'https://maven.neoforged.net/releases' + } + + maven { + name = "Mortuusars Github Maven" + url = "https://raw.githubusercontent.com/mortuusars/resources/main/maven/" + } +} + +dependencies { + jarJar(api("dev.ryanhcode.sable-companion:sable-companion-common-${project.minecraft_version}:[${project.sable_companion_version},)")) { + version { + prefer project.sable_companion_version + } + } + + compileOnly "maven.modrinth:distanthorizons:$rootProject.distant_horizons_version" + compileOnly "maven.modrinth:backpacks-for-dummies:$rootProject.backpacks_for_dummies_version" + + implementation("com.simibubi.create:create-${minecraft_version}:${create_version}") { transitive = false } + implementation("net.createmod.ponder:ponder-neoforge:${ponder_version}+mc${minecraft_version}") + compileOnly("dev.engine-room.flywheel:flywheel-neoforge-api-${minecraft_version}:${flywheel_version}") + implementation("dev.engine-room.flywheel:flywheel-neoforge-${minecraft_version}:${flywheel_version}") + implementation("com.tterrag.registrate:Registrate:${registrate_version}") + + compileOnly("maven.modrinth:protomanlys-weather:${pmweather_version}") + compileOnly("io.github.mortuusars.exposure:exposure-${minecraft_version}-neoforge:${exposure_version}") { transitive = false } + compileOnly("maven.modrinth:jade:${project.jade_version}+neoforge") { transitive = false } + compileOnly("maven.modrinth:jade-addons-forge:${project.jade_addons_version}+neoforge") { transitive = false } + + compileOnly "net.caffeinemc:sodium-neoforge-mod:${sodium_version}" + compileOnly("maven.modrinth:iris:$iris_version") { transitive = false } + compileOnly("maven.modrinth:sodium-extras:neoforge-${minecraft_version}-$sodiumextras_version") { transitive = false } + + jarJar(api("foundry.veil:veil-neoforge-${project.minecraft_version}:${project.veil_version}") { + exclude group: "maven.modrinth" + exclude group: "me.fallenbreath" + }) + compileOnly("foundry.imguimc:imguimc-neoforge-${project.minecraft_version}:${project.imguimc_version}") +} diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java index 321f9bc7..19f19318 100644 --- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java +++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java @@ -3,6 +3,7 @@ import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.simibubi.create.api.behaviour.movement.MovementBehaviour; +import com.simibubi.create.content.contraptions.actors.roller.RollerMovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.kinetics.base.BlockBreakingMovementBehaviour; import dev.ryanhcode.sable.ActiveSableCompanion; @@ -54,6 +55,10 @@ public abstract class BlockBreakingMovementBehaviourMixin implements MovementBeh @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void sable$testBreakingPosDist(final MovementContext context, final CallbackInfo ci) { + if ((Object) this instanceof RollerMovementBehaviour) { + return; + } + final CompoundTag data = context.data; if (data.contains("BreakingPos") || data.contains("LastPos")) { final BlockPos blockPos = NbtUtils.readBlockPos(data, "BreakingPos").orElseGet(() -> NbtUtils.readBlockPos(data, "LastPos").orElse(null)); @@ -76,7 +81,8 @@ public abstract class BlockBreakingMovementBehaviourMixin implements MovementBeh targetCenter = targetSubLevel.logicalPose().transformPosition(targetCenter); } - if (sublevelLocalCenter.distanceToSqr(targetCenter) > 2 * 2) { + final double allowDistanceSqr = this.getActiveAreaOffset(context).lengthSqr() + 1; + if (sublevelLocalCenter.distanceToSqr(targetCenter) > allowDistanceSqr ) { data.remove("Progress"); data.remove("TicksUntilNextProgress"); data.remove("BreakingPos"); diff --git a/settings.gradle b/settings.gradle index 374194c2..5d24fd4f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,51 +1,51 @@ -pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - exclusiveContent { - forRepository { - maven { - name = 'Fabric' - url = uri('https://maven.fabricmc.net') - } - } - filter { - includeGroup('net.fabricmc') - includeGroup('net.fabricmc.unpick') - includeGroup('net.fabricmc.fabric-loom-remap') - } - } - exclusiveContent { - forRepository { - maven { - name = 'Sponge' - url = uri('https://repo.spongepowered.org/repository/maven-public') - } - } - filter { - includeGroupAndSubgroups("org.spongepowered") - } - } - exclusiveContent { - forRepository { - maven { - name = 'Forge' - url = uri('https://maven.minecraftforge.net') - } - } - filter { - includeGroupAndSubgroups('net.minecraftforge') - } - } - } -} - -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 = 'sable' -include('common') -include('fabric') -include('neoforge') +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + exclusiveContent { + forRepository { + maven { + name = 'Fabric' + url = uri('https://maven.fabricmc.net') + } + } + filter { + includeGroup('net.fabricmc') + includeGroup('net.fabricmc.unpick') + includeGroup('net.fabricmc.fabric-loom-remap') + } + } + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = uri('https://repo.spongepowered.org/repository/maven-public') + } + } + filter { + includeGroupAndSubgroups("org.spongepowered") + } + } + exclusiveContent { + forRepository { + maven { + name = 'Forge' + url = uri('https://maven.minecraftforge.net') + } + } + filter { + includeGroupAndSubgroups('net.minecraftforge') + } + } + } +} + +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 = 'sable' +include('common') +include('fabric') +include('neoforge')