diff --git a/build.gradle.kts b/build.gradle.kts index adce75d9..c00e210e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,104 +1,61 @@ import net.fabricmc.loom.api.LoomGradleExtensionAPI -import net.kyori.indra.licenser.spotless.IndraSpotlessLicenserExtension plugins { base - alias(libs.plugins.loom) apply false - alias(libs.plugins.spotless) - alias(libs.plugins.indra.spotlessLicenser) apply false + java + alias(libs.plugins.architectury.loom) apply false + alias(libs.plugins.architectury.plugin) + alias(libs.plugins.shadow) apply false + // TODO: Reinsert the spotless plugin. + //alias(libs.plugins.spotless) + //alias(libs.plugins.indra.spotlessLicenser) apply false } -allprojects { +subprojects { + apply(plugin = "base") + apply(plugin = "java") + apply(plugin = "dev.architectury.loom") + apply(plugin = "architectury-plugin") + apply(plugin = "maven-publish") + group = "org.enginehub.worldeditcui" version = "${rootProject.libs.versions.minecraft.get()}+02+SNAPSHOT" + base.archivesName = "${rootProject.name}-${project.name}" repositories { - // mirrors: - // - https://maven.minecraftforge.net/ - // - https://maven.neoforged.net/ - // - https://maven.parchmentmc.org/ - maven(url = "https://maven.enginehub.org/repo/") { - name = "enginehub" - mavenContent { - excludeGroup("org.lwjgl") // workaround for lwjgl-freetype - } - } - maven(url = "https://maven.terraformersmc.com/releases/") { - name = "terraformersmc" - } - maven(url = "https://repo.viaversion.com/") { - name = "viaversion" - } + // The EngineHub repository mirror the following repository. + // maven { setUrl("https://maven.parchmentmc.org") } + maven { setUrl("https://maven.enginehub.org/repo/") } } -} -subprojects { - apply(plugin = "java") - apply(plugin = "com.diffplug.spotless") - apply(plugin = "net.kyori.indra.licenser.spotless") - apply(plugin = "maven-publish") + java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 - val targetJavaVersion: String by project - val targetVersion = targetJavaVersion.toInt() - extensions.configure(JavaPluginExtension::class) { - sourceCompatibility = JavaVersion.toVersion(targetVersion) - targetCompatibility = sourceCompatibility - if (JavaVersion.current() < JavaVersion.toVersion(targetVersion)) { - toolchain.languageVersion = JavaLanguageVersion.of(targetVersion) - } withSourcesJar() } tasks.withType(JavaCompile::class).configureEach { - options.release = targetVersion + options.release = 21 options.encoding = "UTF-8" options.compilerArgs.addAll(listOf("-Xlint:all", "-Xlint:-processing")) } - tasks.named("processResources", ProcessResources::class).configure { - inputs.property("version", project.version) - - sequenceOf("fabric.mod.json", "META-INF/neoforge.mods.toml").forEach { - filesMatching(it) { - expand("version" to project.version) - } - } + architectury { + minecraft = rootProject.libs.versions.minecraft.get() } - extensions.configure(IndraSpotlessLicenserExtension::class) { - licenseHeaderFile(rootProject.file("HEADER")) + val loom = extensions.getByType(LoomGradleExtensionAPI::class) + loom.run { + silentMojangMappingsLicense() } - plugins.withId("dev.architectury.loom") { - val loom = extensions.getByType(LoomGradleExtensionAPI::class) - loom.run { - decompilerOptions.named("vineflower") { - options.put("win", "0") - } - silentMojangMappingsLicense() - } - - // Ugly hack for easy genSourcening - afterEvaluate { - tasks.matching { it.name == "genSources" }.configureEach { - setDependsOn(setOf("genSourcesWithVineflower")) - } - } - - dependencies { - "minecraft"(libs.minecraft) - "mappings"(loom.layered { - officialMojangMappings { - nameSyntheticMembers = false - } - parchment(variantOf(libs.parchment) { artifactType("zip") }) - }) - "vineflowerDecompilerClasspath"(libs.vineflower) - } - - configurations.named("modLocalRuntime") { - shouldResolveConsistentlyWith(configurations.getByName("modImplementation")) - } + dependencies { + "minecraft"(rootProject.libs.minecraft) + "mappings"(loom.layered() { + officialMojangMappings() + parchment(variantOf(rootProject.libs.parchment) { artifactType("zip") }) + }) } extensions.configure(PublishingExtension::class) { diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..ef872838 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,21 @@ +import dev.architectury.plugin.ArchitectPluginExtension + +extensions.configure { + common(rootProject.properties["enabledPlatforms"].toString().split(',')) +} + +dependencies { + // We depend on Fabric Loader here to use the Fabric @Environment annotations, + // which get remapped to the correct annotations on each platform. + // Do NOT use other classes from Fabric Loader. + modImplementation(rootProject.libs.fabric.loader) + + // Architectury API. This is optional, and you can comment it out if you don't need it. + modImplementation(rootProject.libs.architectury) + + modImplementation(rootProject.libs.cuiProtocol.common) +} + +loom { + accessWidenerPath = file("src/main/resources/worldeditcui.accesswidener") +} \ No newline at end of file diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/InitialisationFactory.java b/common/src/main/java/org/enginehub/worldeditcui/InitialisationFactory.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/InitialisationFactory.java rename to common/src/main/java/org/enginehub/worldeditcui/InitialisationFactory.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/WorldEditCUI.java b/common/src/main/java/org/enginehub/worldeditcui/WorldEditCUI.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/WorldEditCUI.java rename to common/src/main/java/org/enginehub/worldeditcui/WorldEditCUI.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java b/common/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java similarity index 98% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java rename to common/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java index 37607366..76103663 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java +++ b/common/src/main/java/org/enginehub/worldeditcui/config/CUIConfiguration.java @@ -15,7 +15,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; -import net.fabricmc.loader.api.FabricLoader; +import dev.architectury.platform.Platform; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import org.enginehub.worldeditcui.InitialisationFactory; @@ -144,7 +144,7 @@ public void setClearAllOnKey(boolean clearAllOnKey) { } private static Path getConfigFile() { - return FabricLoader.getInstance().getConfigDir().resolve(CUIConfiguration.CONFIG_FILE_NAME); + return Platform.getConfigFolder().resolve(CUIConfiguration.CONFIG_FILE_NAME); } public static CUIConfiguration create() { diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/config/Colour.java b/common/src/main/java/org/enginehub/worldeditcui/config/Colour.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/config/Colour.java rename to common/src/main/java/org/enginehub/worldeditcui/config/Colour.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java b/common/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java similarity index 93% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java rename to common/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java index 36f610ea..5312da2a 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java +++ b/common/src/main/java/org/enginehub/worldeditcui/debug/CUIDebug.java @@ -9,7 +9,7 @@ */ package org.enginehub.worldeditcui.debug; -import net.fabricmc.loader.api.FabricLoader; +import dev.architectury.platform.Platform; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Layout; @@ -33,7 +33,7 @@ */ public final class CUIDebug implements InitialisationFactory { - private static final boolean LOG_ALL_ERRORS = Boolean.getBoolean("wecui.debug.logall") || FabricLoader.getInstance().isDevelopmentEnvironment(); + private static final boolean LOG_ALL_ERRORS = Boolean.getBoolean("wecui.debug.logall") || Platform.isDevelopmentEnvironment(); private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger("WorldEditCUI"); private final WorldEditCUI controller; @@ -50,7 +50,7 @@ public void initialise() throws InitialisationException // Create a logger that logs to console (if in debug mode), and logs to a debug file final Logger loggerImpl = (Logger) LogManager.getLogger("WorldEditCUI"); - final Path debugFile = FabricLoader.getInstance().getGameDir().resolve("worldeditcui.debug.log"); + final Path debugFile = Platform.getGameFolder().resolve("worldeditcui.debug.log"); // Apply defined layout from MC's configured file appender, if possible Layout layout = null; diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/debug/DebugModeEnabledFilter.java b/common/src/main/java/org/enginehub/worldeditcui/debug/DebugModeEnabledFilter.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/debug/DebugModeEnabledFilter.java rename to common/src/main/java/org/enginehub/worldeditcui/debug/DebugModeEnabledFilter.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEvent.java b/common/src/main/java/org/enginehub/worldeditcui/event/CUIEvent.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEvent.java rename to common/src/main/java/org/enginehub/worldeditcui/event/CUIEvent.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventArgs.java b/common/src/main/java/org/enginehub/worldeditcui/event/CUIEventArgs.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventArgs.java rename to common/src/main/java/org/enginehub/worldeditcui/event/CUIEventArgs.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventDispatcher.java b/common/src/main/java/org/enginehub/worldeditcui/event/CUIEventDispatcher.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventDispatcher.java rename to common/src/main/java/org/enginehub/worldeditcui/event/CUIEventDispatcher.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventType.java b/common/src/main/java/org/enginehub/worldeditcui/event/CUIEventType.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/CUIEventType.java rename to common/src/main/java/org/enginehub/worldeditcui/event/CUIEventType.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventBounds.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventBounds.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventBounds.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventBounds.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventColour.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventColour.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventColour.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventColour.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventCylinder.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventCylinder.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventCylinder.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventCylinder.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventEllipsoid.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventEllipsoid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventEllipsoid.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventEllipsoid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventGrid.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventGrid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventGrid.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventGrid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint2D.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint2D.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint2D.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint2D.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint3D.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint3D.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint3D.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPoint3D.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPolygon.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPolygon.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPolygon.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventPolygon.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventSelection.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventSelection.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventSelection.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventSelection.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventUpdate.java b/common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventUpdate.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventUpdate.java rename to common/src/main/java/org/enginehub/worldeditcui/event/cui/CUIEventUpdate.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerChannel.java b/common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerChannel.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerChannel.java rename to common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerChannel.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerWorldRender.java b/common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerWorldRender.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerWorldRender.java rename to common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIListenerWorldRender.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIRenderContext.java b/common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIRenderContext.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIRenderContext.java rename to common/src/main/java/org/enginehub/worldeditcui/event/listeners/CUIRenderContext.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/exceptions/InitialisationException.java b/common/src/main/java/org/enginehub/worldeditcui/exceptions/InitialisationException.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/exceptions/InitialisationException.java rename to common/src/main/java/org/enginehub/worldeditcui/exceptions/InitialisationException.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/exceptions/InvalidSelectionTypeException.java b/common/src/main/java/org/enginehub/worldeditcui/exceptions/InvalidSelectionTypeException.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/exceptions/InvalidSelectionTypeException.java rename to common/src/main/java/org/enginehub/worldeditcui/exceptions/InvalidSelectionTypeException.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java b/common/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java rename to common/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigPanel.java b/common/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigPanel.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigPanel.java rename to common/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigPanel.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/BufferBuilderRenderSink.java b/common/src/main/java/org/enginehub/worldeditcui/render/BufferBuilderRenderSink.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/BufferBuilderRenderSink.java rename to common/src/main/java/org/enginehub/worldeditcui/render/BufferBuilderRenderSink.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/CUISelectionProvider.java b/common/src/main/java/org/enginehub/worldeditcui/render/CUISelectionProvider.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/CUISelectionProvider.java rename to common/src/main/java/org/enginehub/worldeditcui/render/CUISelectionProvider.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/ConfiguredColour.java b/common/src/main/java/org/enginehub/worldeditcui/render/ConfiguredColour.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/ConfiguredColour.java rename to common/src/main/java/org/enginehub/worldeditcui/render/ConfiguredColour.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/CustomStyle.java b/common/src/main/java/org/enginehub/worldeditcui/render/CustomStyle.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/CustomStyle.java rename to common/src/main/java/org/enginehub/worldeditcui/render/CustomStyle.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/LineStyle.java b/common/src/main/java/org/enginehub/worldeditcui/render/LineStyle.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/LineStyle.java rename to common/src/main/java/org/enginehub/worldeditcui/render/LineStyle.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/OptifinePipelineProvider.java b/common/src/main/java/org/enginehub/worldeditcui/render/OptifinePipelineProvider.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/OptifinePipelineProvider.java rename to common/src/main/java/org/enginehub/worldeditcui/render/OptifinePipelineProvider.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/PipelineProvider.java b/common/src/main/java/org/enginehub/worldeditcui/render/PipelineProvider.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/PipelineProvider.java rename to common/src/main/java/org/enginehub/worldeditcui/render/PipelineProvider.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/RenderSink.java b/common/src/main/java/org/enginehub/worldeditcui/render/RenderSink.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/RenderSink.java rename to common/src/main/java/org/enginehub/worldeditcui/render/RenderSink.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/RenderStyle.java b/common/src/main/java/org/enginehub/worldeditcui/render/RenderStyle.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/RenderStyle.java rename to common/src/main/java/org/enginehub/worldeditcui/render/RenderStyle.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/VanillaPipelineProvider.java b/common/src/main/java/org/enginehub/worldeditcui/render/VanillaPipelineProvider.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/VanillaPipelineProvider.java rename to common/src/main/java/org/enginehub/worldeditcui/render/VanillaPipelineProvider.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointCube.java b/common/src/main/java/org/enginehub/worldeditcui/render/points/PointCube.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointCube.java rename to common/src/main/java/org/enginehub/worldeditcui/render/points/PointCube.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointCubeTracking.java b/common/src/main/java/org/enginehub/worldeditcui/render/points/PointCubeTracking.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointCubeTracking.java rename to common/src/main/java/org/enginehub/worldeditcui/render/points/PointCubeTracking.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointRectangle.java b/common/src/main/java/org/enginehub/worldeditcui/render/points/PointRectangle.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/points/PointRectangle.java rename to common/src/main/java/org/enginehub/worldeditcui/render/points/PointRectangle.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/CuboidRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/CuboidRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/CuboidRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/CuboidRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/CylinderRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/CylinderRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/CylinderRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/CylinderRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/EllipsoidRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/EllipsoidRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/EllipsoidRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/EllipsoidRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/PolygonRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/PolygonRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/PolygonRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/PolygonRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/PolyhedronRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/PolyhedronRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/PolyhedronRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/PolyhedronRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/Region.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/Region.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/Region.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/Region.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/RegionType.java b/common/src/main/java/org/enginehub/worldeditcui/render/region/RegionType.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/region/RegionType.java rename to common/src/main/java/org/enginehub/worldeditcui/render/region/RegionType.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DBox.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DBox.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DBox.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DBox.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DGrid.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DGrid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DGrid.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render2DGrid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DBox.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DBox.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DBox.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DBox.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DGrid.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DGrid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DGrid.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DGrid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DPolygon.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DPolygon.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DPolygon.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/Render3DPolygon.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderChunkBoundary.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderChunkBoundary.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderChunkBoundary.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderChunkBoundary.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderBox.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderBox.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderBox.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderBox.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderCircles.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderCircles.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderCircles.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderCircles.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderGrid.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderGrid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderGrid.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderCylinderGrid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderEllipsoid.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderEllipsoid.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderEllipsoid.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderEllipsoid.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderRegion.java b/common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderRegion.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderRegion.java rename to common/src/main/java/org/enginehub/worldeditcui/render/shapes/RenderRegion.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/BoundingBox.java b/common/src/main/java/org/enginehub/worldeditcui/util/BoundingBox.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/BoundingBox.java rename to common/src/main/java/org/enginehub/worldeditcui/util/BoundingBox.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Observable.java b/common/src/main/java/org/enginehub/worldeditcui/util/Observable.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Observable.java rename to common/src/main/java/org/enginehub/worldeditcui/util/Observable.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Observer.java b/common/src/main/java/org/enginehub/worldeditcui/util/Observer.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Observer.java rename to common/src/main/java/org/enginehub/worldeditcui/util/Observer.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector2.java b/common/src/main/java/org/enginehub/worldeditcui/util/Vector2.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector2.java rename to common/src/main/java/org/enginehub/worldeditcui/util/Vector2.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector2m.java b/common/src/main/java/org/enginehub/worldeditcui/util/Vector2m.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector2m.java rename to common/src/main/java/org/enginehub/worldeditcui/util/Vector2m.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector3.java b/common/src/main/java/org/enginehub/worldeditcui/util/Vector3.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/util/Vector3.java rename to common/src/main/java/org/enginehub/worldeditcui/util/Vector3.java diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/icon.png b/common/src/main/resources/assets/worldeditcui/icon.png similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/icon.png rename to common/src/main/resources/assets/worldeditcui/icon.png diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json b/common/src/main/resources/assets/worldeditcui/lang/de_de.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json rename to common/src/main/resources/assets/worldeditcui/lang/de_de.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json b/common/src/main/resources/assets/worldeditcui/lang/en_us.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json rename to common/src/main/resources/assets/worldeditcui/lang/en_us.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json b/common/src/main/resources/assets/worldeditcui/lang/fr_fr.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json rename to common/src/main/resources/assets/worldeditcui/lang/fr_fr.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json b/common/src/main/resources/assets/worldeditcui/lang/nl_nl.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json rename to common/src/main/resources/assets/worldeditcui/lang/nl_nl.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json b/common/src/main/resources/assets/worldeditcui/lang/ru_ru.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json rename to common/src/main/resources/assets/worldeditcui/lang/ru_ru.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json b/common/src/main/resources/assets/worldeditcui/lang/uk_ua.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json rename to common/src/main/resources/assets/worldeditcui/lang/uk_ua.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json b/common/src/main/resources/assets/worldeditcui/lang/zh_cn.json similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json rename to common/src/main/resources/assets/worldeditcui/lang/zh_cn.json diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/textures/gui/checker.png b/common/src/main/resources/assets/worldeditcui/textures/gui/checker.png similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/textures/gui/checker.png rename to common/src/main/resources/assets/worldeditcui/textures/gui/checker.png diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/textures/gui/picker.png b/common/src/main/resources/assets/worldeditcui/textures/gui/picker.png similarity index 100% rename from worldeditcui-fabric/src/main/resources/assets/worldeditcui/textures/gui/picker.png rename to common/src/main/resources/assets/worldeditcui/textures/gui/picker.png diff --git a/worldeditcui-fabric/src/main/resources/worldeditcui.accesswidener b/common/src/main/resources/worldeditcui.accesswidener similarity index 100% rename from worldeditcui-fabric/src/main/resources/worldeditcui.accesswidener rename to common/src/main/resources/worldeditcui.accesswidener diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 00000000..24fcdfe2 --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,66 @@ +repositories { + maven { setUrl("https://maven.terraformersmc.com/") } + maven { setUrl("https://repo.viaversion.com") } +} + +plugins { + alias(libs.plugins.shadow) +} + +architectury { + platformSetupLoomIde() + fabric() +} + +val common: Configuration by configurations.creating +val shadowBundle: Configuration by configurations.creating +val developmentFabric: Configuration by configurations.getting + +configurations { + common.isCanBeResolved = true + common.isCanBeConsumed = false + + compileClasspath { + extendsFrom(common) + } + runtimeClasspath { + extendsFrom(common) + } + developmentFabric.extendsFrom(common) + + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + shadowBundle.isCanBeResolved = true + shadowBundle.isCanBeConsumed = false +} + +dependencies { + modImplementation(rootProject.libs.fabric.loader) + modImplementation(rootProject.libs.fabric.api) + + common(project(":common", "namedElements")) { isTransitive = false } + shadowBundle(project(":common", "transformProductionFabric")) + + modImplementation(rootProject.libs.cuiProtocol.fabric) + modImplementation(rootProject.libs.modmenu) + modCompileOnly(rootProject.libs.viaversion) +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } +} + +tasks.shadowJar { + configurations = listOf(shadowBundle) + archiveClassifier.set("dev-shadow") +} + +tasks.remapJar { + inputFile.set(tasks.shadowJar.get().archiveFile) +} + +// TODO: Add the releasing build scripts \ No newline at end of file diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/CUINetworking.java b/fabric/src/main/java/org/enginehub/worldeditcui/fabric/CUINetworking.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/CUINetworking.java rename to fabric/src/main/java/org/enginehub/worldeditcui/fabric/CUINetworking.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/ConfigPanelFactory.java b/fabric/src/main/java/org/enginehub/worldeditcui/fabric/ConfigPanelFactory.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/ConfigPanelFactory.java rename to fabric/src/main/java/org/enginehub/worldeditcui/fabric/ConfigPanelFactory.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java b/fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java rename to fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/ViaFabricPlusHook.java b/fabric/src/main/java/org/enginehub/worldeditcui/fabric/ViaFabricPlusHook.java similarity index 100% rename from worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/ViaFabricPlusHook.java rename to fabric/src/main/java/org/enginehub/worldeditcui/fabric/ViaFabricPlusHook.java diff --git a/worldeditcui-fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json similarity index 79% rename from worldeditcui-fabric/src/main/resources/fabric.mod.json rename to fabric/src/main/resources/fabric.mod.json index 579d7190..11becaa3 100644 --- a/worldeditcui-fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -35,14 +35,9 @@ }, "depends": { "worldeditcui_protocol": "*", - "fabric-api-base": "*", - "fabric-key-binding-api-v1": "^1.0.0", - "fabric-networking-api-v1": "*", - "fabric-rendering-v1": ">=1.5.0", - "fabric-lifecycle-events-v1": "^2.0.0", - "fabric-screen-api-v1": ">=1.0.9", - "fabric-resource-loader-v0": ">=0.4.17", - "fabric-transitive-access-wideners-v1": "*", + "fabricloader": ">=0.18.3", + "fabric-api": "*", + "architectury": ">=19.0.1", "minecraft": ">=1.21.9" }, "suggests": { diff --git a/gradle.properties b/gradle.properties index c57a9d41..f167262b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,6 @@ cfProjectId=402098 # Project configuration -targetJavaVersion=21 enabledPlatforms=fabric,neoforge # Gradle diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 409054e0..bce44306 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,46 +2,69 @@ format = { version = "1.1" } [versions] -indra = "3.1.3" minecraft = "1.21.11" + +# Mod Loaders & Wrapper fabricLoader = "0.18.3" fabricApi = "0.140.0+1.21.11" +neoforge = "21.11.32-beta" +architectury = "19.0.1" +architecturyPlugin = "3.4.162" +architecturyLoom = "1.13.463" + +# CUI dependencies +worldedit = "7.3.14" +cuiProtocol = "4.0.2" modmenu = "16.0.0-rc.1" viafabricplus = "3.3.0" +viaversion = "5.0.5" + +# Dev Dependencies (Workflow, Publish) +parchment = "2025.10.12" +indra = "3.1.3" vineflower = "1.10.1" -cuiProtocol = "4.0.2" +shadow = "8.3.5" +spotless = "6.25.0" +jvmConflictResolution = "2.1.2" +versions = "0.51.0" +curseForgeGradle = "1.1.26" +publishGithubRelease = "0.1.0" +minotaur = "2.8.7" [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } -parchment = { module = "org.parchmentmc.data:parchment-1.21.10", version = "2025.10.12" } + +# Mod Loaders fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabricLoader" } fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabricApi" } -fabric-api-bom = { module = "net.fabricmc.fabric-api:fabric-api-bom", version.ref = "fabricApi" } -fabric-api-networking = { module = "net.fabricmc.fabric-api:fabric-networking-api-v1" } +neoforge = { module = "net.neoforged:neoforge", version.ref = "neoforge"} +architectury = { module = "dev.architectury:architectury", version.ref = "architectury" } + +# CUI Dependencies +worldedit = { module = "com.sk89q.worldedit:worldedit-fabric-mc1.21", version.ref = "worldedit" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } -neoforge = { module = "net.neoforged:neoforge", version = "21.10.9-beta"} viafabricplus-api = { module = "de.florianmichael:ViaFabricPlus", version.ref = "viafabricplus" } -viaversion = { module = "com.viaversion:viaversion-common", version = "5.0.5" } +viaversion = { module = "com.viaversion:viaversion-common", version.ref = "viaversion" } +cuiProtocol-common = { module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-common-mc1.21.11", version.ref = "cuiProtocol"} +cuiProtocol-fabric = { module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.11", version.ref = "cuiProtocol"} +cuiProtocol-neoforge = { module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.11", version.ref = "cuiProtocol"} + +# Dev Dependencies vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" } -worldedit = { module = "com.sk89q.worldedit:worldedit-fabric-mc1.21", version = "7.3.14" } +parchment = { module = "org.parchmentmc.data:parchment-1.21.10", version.ref = "parchment" } [plugins] -architecturyPlugin = { id = "architectury-plugin", version = "3.4.160" } -curseForgeGradle = { id = "net.darkhax.curseforgegradle", version = "1.1.26" } +# From the Architectury Template +architectury-plugin = { id = "architectury-plugin", version.ref = "architecturyPlugin" } +architectury-loom = { id = "dev.architectury.loom", version.ref = "architecturyLoom" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } + +# Dev Workflow indra-git = { id = "net.kyori.indra.git", version.ref = "indra" } indra-spotlessLicenser = { id = "net.kyori.indra.licenser.spotless", version.ref = "indra" } -jvmConflictResolution = { id = "org.gradlex.jvm-dependency-conflict-resolution", version = "2.1.2" } -loom = { id = "dev.architectury.loom", version = "1.13.463" } -minotaur = { id = "com.modrinth.minotaur", version = "2.8.7" } -publishGithubRelease = { id = "ca.stellardrift.publish-github-release", version = "0.1.0" } -shadow = { id = "com.gradleup.shadow", version = "8.3.5" } -spotless = { id = "com.diffplug.spotless", version = "6.25.0" } -versions = { id = "com.github.ben-manes.versions", version = "0.51.0" } - -[libraries.cuiProtocol-fabric] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.11" -version.ref = "cuiProtocol" - -[libraries.cuiProtocol-neoforge] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.11" -version.ref = "cuiProtocol" +spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } +jvmConflictResolution = { id = "org.gradlex.jvm-dependency-conflict-resolution", version.ref = "jvmConflictResolution" } +versions = { id = "com.github.ben-manes.versions", version.ref = "versions" } +curseForgeGradle = { id = "net.darkhax.curseforgegradle", version.ref = "curseForgeGradle" } +publishGithubRelease = { id = "ca.stellardrift.publish-github-release", version.ref = "publishGithubRelease" } +minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 00000000..0df1d3cb --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,62 @@ +repositories { + maven { setUrl("https://maven.neoforged.net/releases") } +} + +plugins { + alias(libs.plugins.shadow) +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +val common: Configuration by configurations.creating +val shadowBundle: Configuration by configurations.creating +val developmentNeoForge: Configuration by configurations.getting + +configurations { + common.isCanBeResolved = true + common.isCanBeConsumed = false + + compileClasspath { + extendsFrom(common) + } + runtimeClasspath { + extendsFrom(common) + } + developmentNeoForge.extendsFrom(common) + + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + shadowBundle.isCanBeResolved = true + shadowBundle.isCanBeConsumed = false +} + +dependencies { + neoForge(rootProject.libs.neoforge) + + common(project(":common", "namedElements")) { isTransitive = false } + shadowBundle(project(":common", "transformProductionNeoForge")) + + modImplementation(rootProject.libs.cuiProtocol.neoforge) +} + +tasks.processResources { + inputs.property("version", project.version) + + filesMatching("META-INF/neoforge.mods.toml") { + expand("version" to project.version) + } +} + +tasks.shadowJar { + configurations = listOf(shadowBundle) + archiveClassifier.set("dev-shadow") +} + +tasks.remapJar { + inputFile.set(tasks.shadowJar.get().archiveFile) +} + +// TODO: Add the releasing build scripts \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 00000000..2e6ed767 --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform = neoforge diff --git a/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/CUINetworking.java b/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/CUINetworking.java new file mode 100644 index 00000000..700d4bc6 --- /dev/null +++ b/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/CUINetworking.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.neoforge; + +import net.neoforged.neoforge.client.network.ClientPacketDistributor; +import org.enginehub.worldeditcui.protocol.CUIPacket; +import org.enginehub.worldeditcui.protocol.CUIPacketHandler; +import org.enginehub.worldeditcui.neoforge.protocol.NeoForgeCUIPacketHandler; + +import java.util.function.BiConsumer; + +/** + * Networking wrappers to integrate nicely with MultiConnect. + * + *

These methods generally first call

+ */ +final class CUINetworking { + + private CUINetworking() { + } + + public static void send(final CUIPacket pkt) { + ClientPacketDistributor.sendToServer(pkt); + } + + public static void subscribeToCuiPacket(final BiConsumer handler) { + CUIPacketHandler.instance().registerClientboundHandler(handler); + } +} diff --git a/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/NeoForgeModWorldEditCUI.java b/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/NeoForgeModWorldEditCUI.java new file mode 100644 index 00000000..ff6547e9 --- /dev/null +++ b/neoforge/src/main/java/org/enginehub/worldeditcui/neoforge/NeoForgeModWorldEditCUI.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2011-2024 WorldEditCUI team and contributors + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.enginehub.worldeditcui.neoforge; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.Level; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.ExtractLevelRenderStateEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import net.neoforged.neoforge.common.NeoForge; +import org.enginehub.worldeditcui.WorldEditCUI; +import org.enginehub.worldeditcui.config.CUIConfiguration; +import org.enginehub.worldeditcui.event.listeners.CUIListenerChannel; +import org.enginehub.worldeditcui.event.listeners.CUIListenerWorldRender; +import org.enginehub.worldeditcui.gui.CUIConfigPanel; +import org.enginehub.worldeditcui.neoforge.protocol.NeoForgeCUIPacketHandler; +import org.enginehub.worldeditcui.protocol.CUIPacket; +import org.enginehub.worldeditcui.render.OptifinePipelineProvider; +import org.enginehub.worldeditcui.render.PipelineProvider; +import org.enginehub.worldeditcui.render.VanillaPipelineProvider; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.MixinEnvironment; + +import java.util.List; + +/** + * NeoForge mod entrypoint + * + * @author Mark Vainomaa + */ +@Mod(NeoForgeModWorldEditCUI.MOD_ID) +public final class NeoForgeModWorldEditCUI { + private static final int DELAYED_HELO_TICKS = 10; + + public static final String MOD_ID = "worldeditcui"; + private static NeoForgeModWorldEditCUI instance; + + // TODO: Key mappings could be moved to `common`: https://docs.architectury.dev/api/keymappings + private static final KeyMapping.Category KEYBIND_CATEGORY_WECUI + = new KeyMapping.Category(Identifier.fromNamespaceAndPath(MOD_ID, "general")); + + private final KeyMapping keyBindToggleUI = key("toggle", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindClearSel = key("clear", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindChunkBorder = key("chunk", GLFW.GLFW_KEY_UNKNOWN); + + private static final List RENDER_PIPELINES = List.of( + new OptifinePipelineProvider(), + new VanillaPipelineProvider()); + + private WorldEditCUI controller; + private CUIListenerWorldRender worldRenderListener; + private CUIListenerChannel channelListener; + + private Level lastWorld; + private LocalPlayer lastPlayer; + + private boolean visible = true; + private int delayedHelo = 0; + + private DeltaTracker lastPartialTicks; + + /** + * Register a key binding + * + * @param name id, will be used as a localization key under + * {@code key.worldeditcui.} + * @param code default value + * @return new, registered keybinding in the mod category + */ + private static KeyMapping key(final String name, final int code) { + return new KeyMapping("key." + MOD_ID + '.' + name, code, KEYBIND_CATEGORY_WECUI); + } + + public NeoForgeModWorldEditCUI(IEventBus eventBus, ModContainer container) { + if (Boolean.getBoolean("wecui.debug.mixinaudit")) { + MixinEnvironment.getCurrentEnvironment().audit(); + } + + instance = this; + + // Only subscribing on the client + if (FMLEnvironment.getDist().isClient()) { + // TODO: Check if possible to move some events to common: https://docs.architectury.dev/api/events + // Mod Event Bus + eventBus.addListener(NeoForgeModWorldEditCUI::onRegisterKeyMapping); + eventBus.addListener(NeoForgeModWorldEditCUI::onClientLifecycleClientStarted); + CUINetworking.subscribeToCuiPacket(this::onPluginMessage); + + // Game Event Bus + NeoForge.EVENT_BUS.addListener(NeoForgeModWorldEditCUI::onClientTickEnd); + NeoForge.EVENT_BUS.addListener(NeoForgeModWorldEditCUI::onClientPlayConnectionJoin); + NeoForge.EVENT_BUS.addListener(NeoForgeModWorldEditCUI::onWorldEventEndExtraction); + NeoForge.EVENT_BUS.addListener(NeoForgeModWorldEditCUI::onWorldEventEndMain); + + container.registerExtensionPoint(IConfigScreenFactory.class, + (mc, parent) -> new CUIConfigPanel(parent, instance.getController().getConfiguration())); + } + } + + private static void onRegisterKeyMapping(RegisterKeyMappingsEvent event) { + event.register(instance.keyBindChunkBorder); + event.register(instance.keyBindClearSel); + event.register(instance.keyBindToggleUI); + } + + private static void onClientLifecycleClientStarted(FMLClientSetupEvent event) { + instance.onGameInitDone(Minecraft.getInstance()); + } + + private static void onClientTickEnd(ClientTickEvent.Post event) { + instance.onTick(Minecraft.getInstance()); + } + + private static void onClientPlayConnectionJoin(ClientPlayerNetworkEvent.LoggingIn event) { + instance.onJoinGame(Minecraft.getInstance().getConnection()); + } + + // Equivalent to Fabric's WorldRenderEvents.END_EXTRACTION + private static void onWorldEventEndExtraction(ExtractLevelRenderStateEvent event) { + instance.lastPartialTicks = event.getDeltaTracker(); + } + + // Equivalent to Fabric's WorldRenderEvents.END_MAIN + private static void onWorldEventEndMain(RenderLevelStageEvent.AfterTranslucentBlocks event) { + try { + RenderSystem.getModelViewStack().pushMatrix(); + RenderSystem.getModelViewStack().mul(event.getPoseStack().last().pose()); + // RenderSystem.applyModelViewMatrix(); + instance.onPostRenderEntities(instance.lastPartialTicks); + } + finally { + RenderSystem.getModelViewStack().popMatrix(); + // RenderSystem.applyModelViewMatrix(); + } + } + + private void onTick(final Minecraft mc) { + final CUIConfiguration config = this.controller.getConfiguration(); + final boolean inGame = mc.player != null; + final boolean clock = mc.getDeltaTracker().getGameTimeDeltaPartialTick(false) > 0; + + if (inGame && mc.screen == null) { + // TODO: If moving key mappings to common, replace with `this.controller.keyBindToggleUI` + while (this.keyBindToggleUI.consumeClick()) { + this.visible = !this.visible; + } + + // TODO: If moving key mappings to common, replace with `this.controller.keyBindClearSel` + while (this.keyBindClearSel.consumeClick()) { + if (mc.player != null) { + mc.player.connection.sendUnattendedCommand("/sel", null); + } + + if (config.isClearAllOnKey()) { + this.controller.clearRegions(); + } + } + + // TODO: If moving key mappings to common, replace with `this.controller.keyBindChunkBorder` + while (this.keyBindChunkBorder.consumeClick()) { + this.controller.toggleChunkBorders(); + } + } + + if (inGame && clock && this.controller != null) { + if (mc.level != this.lastWorld || mc.player != this.lastPlayer) { + this.lastWorld = mc.level; + this.lastPlayer = mc.player; + + this.controller.getDebugger().debug("World change detected, sending new handshake"); + this.controller.clear(); + this.helo(); + this.delayedHelo = NeoForgeModWorldEditCUI.DELAYED_HELO_TICKS; + if (mc.player != null && config.isPromiscuous()) { + mc.player.connection.sendUnattendedCommand("we cui", null); // Tricks WE to send the current selection + } + } + + if (this.delayedHelo > 0) { + this.delayedHelo--; + if (this.delayedHelo == 0) { + this.helo(); + } + } + } + } + + public void onPluginMessage(final CUIPacket payload, final NeoForgeCUIPacketHandler.PacketContext ctx) { + try { + ctx.workExecutor().execute(() -> this.channelListener.onMessage(payload)); + } catch (final Exception ex) { + this.getController().getDebugger().info("Error decoding payload from server", ex); + } + } + + public void onGameInitDone(final Minecraft client) { + this.controller = new WorldEditCUI(); + this.controller.initialise(client); + this.worldRenderListener = new CUIListenerWorldRender(this.controller, client, RENDER_PIPELINES); + this.channelListener = new CUIListenerChannel(this.controller); + } + + public void onJoinGame(final ClientPacketListener handler) { + this.visible = true; + this.controller.getDebugger().debug("Joined game, sending initial handshake"); + this.helo(); + } + + public void onPostRenderEntities(final DeltaTracker timer) { + if (this.visible) { + this.worldRenderListener.onRender(timer.getGameTimeDeltaPartialTick(true)); + } + } + + private void helo() { + CUINetworking.send(new CUIPacket("v", CUIPacket.protocolVersion())); + } + + public WorldEditCUI getController() { + return this.controller; + } + + public static NeoForgeModWorldEditCUI getInstance() { + return instance; + } +} 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 00000000..b15aeac6 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,57 @@ +modLoader = "javafml" +loaderVersion = "[10,)" +issueTrackerURL = "https://github.com/EngineHub/WorldEditCUI/issues" +license = "EPL-2.0" + +[[mods]] +modId = "worldeditcui" +version = "${version}" +displayName = "WorldEditCUI" +authors = "lahwran, yetanotherx, Mumfrey, TomyLobo, mikroskeem" +description = ''' +Client-side user interface for WorldEdit +''' +logoFile = "assets/worldeditcui/icon.png" +modUrl = "https://github.com/EngineHub/WorldEditCUI" + +[[dependencies.worldeditcui]] +modId = "neoforge" +type = "required" +versionRange = "[21.11,)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.worldeditcui]] +modId = "minecraft" +type = "required" +versionRange = "[1.21.11,)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.worldeditcui]] +modId = "worldedit" +type = "optional" +versionRange = "[7.3.17,)" +ordering = "AFTER" +side = "CLIENT" + +[[dependencies.worldeditcui]] +modId = "worldedit" +type = "incompatible" +versionRange = "(,7.3.17)" +ordering = "AFTER" +side = "CLIENT" + +[[dependencies.worldeditcui]] +modId = "worldeditcui_protocol" +type = "required" +versionRange = "" +ordering = "AFTER" +side = "CLIENT" + +[[dependencies.worldeditcui]] +modId = "architectury" +type = "required" +versionRange = "[19.0.1,)" +ordering = "AFTER" +side = "CLIENT" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index b6bd90cb..a0687704 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,19 +2,15 @@ rootProject.name = "WorldEditCUI" pluginManagement { repositories { - // mirrors: - // - https://maven.architectury.dev/ - // - https://maven.fabricmc.net/ - maven(url = "https://maven.enginehub.org/repo/") { - name = "enginehub" - } - // maven("https://maven.fabricmc.net/") - gradlePluginPortal() + // The EngineHub repository mirror the following repository. + // maven { setUrl("https://maven.fabricmc.net/") } + // maven { setUrl("https://maven.architectury.dev/") } + // maven { setUrl("https://files.minecraftforge.net/maven/") } + maven { setUrl("https://maven.enginehub.org/repo/") } + gradlePluginPortal() } } -sequenceOf( - "fabric", -).forEach { - include("worldeditcui-$it") -} +include("common") +include("fabric") +include("neoforge") diff --git a/worldeditcui-fabric/build.gradle.kts b/worldeditcui-fabric/build.gradle.kts deleted file mode 100644 index f3dfaa0c..00000000 --- a/worldeditcui-fabric/build.gradle.kts +++ /dev/null @@ -1,281 +0,0 @@ -import net.darkhax.curseforgegradle.Constants -import net.darkhax.curseforgegradle.TaskPublishCurseForge -import net.fabricmc.loom.LoomGradleExtension - -plugins { - java - alias(libs.plugins.indra.git) - alias(libs.plugins.indra.spotlessLicenser) - alias(libs.plugins.loom) - alias(libs.plugins.versions) - alias(libs.plugins.curseForgeGradle) - alias(libs.plugins.minotaur) - alias(libs.plugins.publishGithubRelease) -} - -base { - archivesName = "WorldEditCUI" -} -loom { - runs { - named("client") { - // Mixin debug options - vmArgs( - // "-Dmixin.debug.verbose=true", - // "-Dmixin.debug.export=true", - // "-Dmixin.debug.export.decompile.async=false", // to get decompiled sources when mixins straight up fail to apply - "-Dmixin.dumpTargetOnFailure=true", - "-Dmixin.checks.interfaces=true", - "-Dwecui.debug.mixinaudit=true", - "-Doptifabric.extract=true" - ) - } - } - - accessWidenerPath.set(project.file("src/main/resources/worldeditcui.accesswidener")) -} - -val fabricApi by configurations.creating -dependencies { - "include"(libs.cuiProtocol.fabric) - "modImplementation"(libs.cuiProtocol.fabric) - modImplementation(libs.fabric.loader) - modImplementation(libs.modmenu) - modCompileOnly(libs.viafabricplus.api) { - isTransitive = false - } - modCompileOnly(libs.viaversion) - - // [1] declare fabric-api dependency... - fabricApi(libs.fabric.api) - - // [2] Load the API dependencies from the fabric mod json... - @Suppress("UNCHECKED_CAST") - val fabricModJson = file("src/main/resources/fabric.mod.json").bufferedReader().use { - groovy.json.JsonSlurper().parse(it) as Map> - } - val wantedDependencies = (fabricModJson["depends"] ?: error("no depends in fabric.mod.json")).keys - .filter { it == "fabric-api-base" || it.contains(Regex("v\\d$")) } - .map { "net.fabricmc.fabric-api:$it" } - .toSet() - logger.lifecycle("Looking for these dependencies:") - for (wantedDependency in wantedDependencies) { - logger.lifecycle(wantedDependency) - } - // [3] and now we resolve it to pick out what we want :D - val fabricApiDependencies = fabricApi.incoming.resolutionResult.allDependencies - .onEach { - if (it is UnresolvedDependencyResult) { - throw kotlin.IllegalStateException("Failed to resolve Fabric API", it.failure) - } - } - .filterIsInstance() - // pick out transitive dependencies - .flatMap { - it.selected.dependencies - } - // grab the requested versions - .map { it.requested } - .filterIsInstance() - // map to standard notation - .associateByTo( - mutableMapOf(), - keySelector = { "${it.group}:${it.module}" }, - valueTransform = { "${it.group}:${it.module}:${it.version}" } - ) - fabricApiDependencies.keys.retainAll(wantedDependencies) - // sanity check - for (wantedDep in wantedDependencies) { - check(wantedDep in fabricApiDependencies) { "Fabric API library $wantedDep is missing!" } - } - - fabricApiDependencies.values.forEach { - "include"(it) - "modImplementation"(it) - } - - // for development - /*modLocalRuntime(libs.worldedit) { - exclude("com.google.guava", "guava") - exclude("com.google.code.gson", "gson") - exclude("com.google.code.gson", "gson") - exclude("it.unimi.dsi", "fastutil") - exclude("org.apache.logging.log4j", "log4j-api") - }*/ -} - -val targetJavaVersion: String by project -tasks { - register("generateStandaloneRun") { - description = "Generate a script that will run WorldEdit CUI, for graphics debugging" - val scriptDest = project.layout.buildDirectory.file(if (System.getProperty("os.name").contains("windows", ignoreCase = true)) { - "run-dev.bat" - } else { - "run-dev" - }) - val argsDest = project.layout.buildDirectory.file("run-dev-args.txt") - val taskClasspath = project.files(jar.map { it.outputs }, configurations.runtimeClasspath) - val toolchain = project.javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(targetJavaVersion) } - inputs.files(taskClasspath) - .ignoreEmptyDirectories() - .withPropertyName("runClasspath") - // inputs.property("javaLauncher", toolchain) - outputs.file(scriptDest) - outputs.file(argsDest) - doLast { - val clientRun = loom.runConfigs.getByName("client") - - // technically uses internal API, but it's non-essential - argsDest.get().asFile.writeText(""" - -Dfabric.dli.config=${(loom as LoomGradleExtension).files.devLauncherConfig.absolutePath} - -Dfabric.dli.env=client - -Dfabric.dli.main=${clientRun.defaultMainClass} - ${clientRun.vmArgs.joinToString(System.lineSeparator())} - -cp ${taskClasspath.asPath} - net.fabricmc.devlaunchinjector.Main - ${clientRun.programArgs.joinToString(System.lineSeparator())} - """.trimIndent(), Charsets.UTF_8) - scriptDest.get().asFile.writeText(""" - ${toolchain.get().executablePath.asFile.absolutePath} "@${argsDest.get().asFile.absolutePath}" - """.trimIndent(), Charsets.UTF_8) - } - } - - withType(net.fabricmc.loom.task.AbstractRunTask::class).configureEach { - // Configure mixin agent - // Resolve the Mixin configuration - val mixinSource = configurations.runtimeClasspath.get().incoming - .artifactView { componentFilter { it is ModuleComponentIdentifier && it.module == "sponge-mixin" && it.group == "net.fabricmc" } } - .files - inputs.files(mixinSource).withPropertyName("mixinAgent") - - jvmArgumentProviders += CommandLineArgumentProvider { - // Java agent: the jar file for mixin - if (!mixinSource.isEmpty) { - listOf("-javaagent:${mixinSource.singleFile}") - } else { - emptyList() - } - } - } - -} - -// Releasing -val changelogContents = objects.property(String::class) -changelogContents.set(providers.gradleProperty("changelog") - .map { file(it) } - .filter { it.exists() } - .map { it.readText(Charsets.UTF_8) }) -changelogContents.finalizeValueOnRead() -val versionName = project.provider { project.version } - -val cfApiToken = providers.gradleProperty("cfApiToken") -val modrinthToken = providers.gradleProperty("modrinthToken") - .orElse(providers.environmentVariable("MODRINTH_TOKEN")) -val githubToken = providers.gradleProperty("githubToken") - .orElse(providers.environmentVariable("GITHUB_TOKEN")) - -tasks { - val validateRelease by registering { - inputs.property("changelog", changelogContents).optional(true) - inputs.property("version", versionName) - - doLast { - val problems = mutableListOf() - // General release-readiness - if (indraGit.headTag() == null) { - problems.add("Tried to perform a release without being checked out to a tag") - } - if (versionName.get().toString().contains("SNAPSHOT")) { - problems.add("SNAPSHOT versions of WorldEditCUI cannot be published") - } - if (!changelogContents.isPresent) { - problems.add("A file with changelog text must be provided using the 'changelog' Gradle property") - } - - // CF - if (!cfApiToken.isPresent) { - problems.add("No CurseForge API token was set with the 'cfApiToken' Gradle property") - } - - // MR - if (!modrinthToken.isPresent) { - problems.add("No Modrinth access token was set with either the 'modrinthToken' Gradle property, or 'MODRINTH_TOKEN' environment variable") - } - - // GH - if (!githubToken.isPresent) { - problems.add("No GitHub access token was set with either the 'githubToken' Gradle property, or 'GITHUB_TOKEN' environment variable") - } - - when (problems.size) { - 0 -> return@doLast - 1 -> { - throw InvalidUserDataException(problems[0]) - } - else -> throw InvalidUserDataException( - "WorldEditCUI detected the following problems when trying to perform a release:\n\n" - + problems.joinToString("\n - ", prefix = " - ") - ) - } - } - } - - val publishToCurseForge by registering(TaskPublishCurseForge::class) { - val cfProjectId = providers.gradleProperty("cfProjectId") - - apiToken = cfApiToken.get() - - with(upload(cfProjectId.get(), remapJar)) { - displayName = project.version - releaseType = Constants.RELEASE_TYPE_RELEASE - changelog = changelogContents.getOrElse("") - // Rendering plugins - addOptional("canvas-renderer", "sodium", "irisshaders") - // Config screens, version compatibility - addOptional("modmenu", "viafabricplus", "worldedit") - addJavaVersion("Java $targetJavaVersion") - addGameVersion(libs.versions.minecraft.get()) - } - } - - val releaseTasks = listOf(publishToCurseForge, publishToGitHub, modrinth) - releaseTasks.forEach { - it.configure { dependsOn(validateRelease) } - } - - register("publishRelease") { - group = PublishingPlugin.PUBLISH_TASK_GROUP - dependsOn(releaseTasks) - } -} - -modrinth { - token = modrinthToken - projectId = "worldedit-cui" - syncBodyFrom = providers.provider { file("README.md").readText(Charsets.UTF_8) } - uploadFile.set(tasks.remapJar) - gameVersions.add(libs.versions.minecraft.get()) - changelog = changelogContents - dependencies { - optional.project("canvas") - optional.project("sodium") - optional.project("iris") - // Config screens, version compatibility - optional.project("modmenu") - optional.project("viafabricplus") - optional.project("worldedit") - } -} - -githubRelease { - apiToken = githubToken - tagName = project.provider { - indraGit.headTag()?.run { org.eclipse.jgit.lib.Repository.shortenRefName(name) } - } - repository = "EngineHub/WorldEditCUI" - releaseName = "WorldEditCUI v$version" - releaseBody = changelogContents - artifacts.from(tasks.remapJar) -}