diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index ecc0a8229..a507eb96c 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -34,6 +34,7 @@ fun Project.configureDependencies() { maven("https://repo.codemc.org/repository/maven-public") maven("https://repo.codemc.io/repository/nms/") maven("https://papermc.io/repo/repository/maven-public/") + maven ( "https://files.minecraftforge.net/maven/" ) } dependencies { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index ca7ad4360..f0b5efc0f 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -28,6 +28,22 @@ object Versions { const val minotaur = "1.1.0" } + object Mod { + const val minecraft = "1.19" + const val yarn = "$minecraft+build.1" + const val fabricLoader = "0.14.2" + + const val architecuryLoom = "0.12.0-SNAPSHOT" + const val architectutyPlugin = "3.4-SNAPSHOT" + } + + object Forge { + const val minecraft = "1.19" + const val forge = "$minecraft-41.0.38" + const val yarn = "$minecraft+build.1" + const val architecuryLoom = "0.12.0-SNAPSHOT" + } + object Bukkit { const val paper = "1.18.2-R0.1-SNAPSHOT" const val paperLib = "1.0.5" diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index fae96eac5..2fce99b17 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -1,6 +1,7 @@ dependencies { api("ca.solo-studios", "strata", Versions.Libraries.strata) - api("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) + compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) + testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) api("cloud.commandframework", "cloud-core", Versions.Libraries.cloud) api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java index ad4c2c879..4727b57e2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -145,6 +146,11 @@ public final class Pair { } } + public Pair apply(BiConsumer consumer) { + consumer.accept(this.left, this.right); + return this; + } + @Override public String toString() { return String.format("{%s,%s}", left, right); diff --git a/common/implementation/base/build.gradle.kts b/common/implementation/base/build.gradle.kts index 64c176c77..1910484f0 100644 --- a/common/implementation/base/build.gradle.kts +++ b/common/implementation/base/build.gradle.kts @@ -2,6 +2,8 @@ dependencies { api(project(":common:api")) api(project(":common:implementation:bootstrap-addon-loader")) + testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) + implementation("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) implementation("org.apache.commons", "commons-text", Versions.Libraries.Internal.apacheText) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index fe04ef97e..81933014f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -111,8 +111,12 @@ public abstract class AbstractPlatform implements Platform { logger.info("Loading config.yml"); File configFile = new File(getDataFolder(), "config.yml"); if(!configFile.exists()) { - logger.info("Writing new config.yml..."); - FileUtils.copyInputStreamToFile(stream, configFile); + logger.info("Dumping config.yml..."); + if(stream == null) { + logger.warn("Could not find config.yml in JAR"); + } else { + FileUtils.copyInputStreamToFile(stream, configFile); + } } } catch(IOException e) { logger.error("Error loading config.yml resource from jar", e); diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index e0a1bc48a..7221c9f90 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -1,20 +1,9 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import java.net.URL -import java.nio.channels.Channels -import java.nio.file.Files -import java.nio.file.StandardCopyOption plugins { id("xyz.jpenilla.run-paper") version "1.0.6" } -val testDir = "target/server" -val testMem = "3G" - -val paperBuild = 350 -val paperURL = "https://papermc.io/api/v2/projects/paper/versions/%version%/builds/$paperBuild/downloads/paper-%version%-$paperBuild.jar" -val purpurURL = "https://api.purpurmc.org/v2/purpur/%version%/latest/download" - repositories { maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") } @@ -26,174 +15,27 @@ dependencies { shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper) } -val throttleCoreCount = 0 - -val jvmFlags = mutableListOf( - "-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", - "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", - "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", - "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", - "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", - "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", - "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", - "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear", /*"-javaagent:paperclip.jar"*/ - ) -if(throttleCoreCount > 0) { - jvmFlags.add("-XX:ActiveProcessorCount=$throttleCoreCount") -} - - -fun downloadPaperclip(url: String, dir: String) { - val clip = URL(url.replace("%version%", Versions.Bukkit.minecraft)) - val clipReadableByteChannel = Channels.newChannel(clip.openStream()) - val clipFile = file("$testDir/$dir/paperclip.jar") - val clipOutputStream = clipFile.outputStream() - val clipFileChannel = clipOutputStream.channel - clipFileChannel.transferFrom(clipReadableByteChannel, 0, Long.MAX_VALUE) -} - -fun copyTerra(dir: String) { - file("$testDir/$dir").walk().forEach { - if (it.name.startsWith("Terra-bukkit") && it.name.endsWith(".jar")) it.delete() // Delete old Terra jar(s) - } - copy { - from("$buildDir/libs/Terra-bukkit-$version-shaded.jar") - into("$testDir/$dir/plugins/") - } -} - -fun installServer(dir: String) { - // clean - file("$testDir/$dir").deleteRecursively() - file("$testDir/$dir/plugins").mkdirs() - // Cloning test setup. - gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") - // Copying plugins - Files.move( - file("WorldGenTestServer/plugins").toPath(), - file("$testDir/$dir/plugins").toPath(), - StandardCopyOption.REPLACE_EXISTING - ) - // Copying config - val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() - file("$testDir/$dir/server.properties").writeText(serverText) - val bukkitText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/bukkit.yml").readText() - file("$testDir/$dir/bukkit.yml").writeText(bukkitText.replace("\${world}", "world").replace("\${gen}", "Terra:DEFAULT")) - - println("By proceeding, you are agreeing to the Minecraft EULA: https://account.mojang.com/documents/minecraft_eula") - file("$testDir/$dir/eula.txt").writeText("eula=true") - - // clean up - file("WorldGenTestServer").deleteRecursively() -} - -fun deleteFolder(folder: File) { - if (folder.exists()) folder.deleteRecursively() -} - -fun deleteFile(file: File) { - if (file.exists()) file.delete() -} - -tasks.create("cleanWorlds") { - group = "bukkit" - doFirst { - deleteFolder(file("$testDir/paper/world")) - deleteFolder(file("$testDir/paper/world_nether")) - deleteFolder(file("$testDir/paper/world_the_end")) - - deleteFolder(file("$testDir/purpur/world")) - deleteFolder(file("$testDir/purpur/world_nether")) - deleteFolder(file("$testDir/purpur/world_the_end")) - } -} - -tasks.create("updatePaper") { - group = "bukkit" - doFirst { - deleteFile(file("$testDir/paper/paperclip.jar")) - downloadPaperclip(paperURL, "paper") - } -} - -tasks.create("updatePurpur") { - group = "bukkit" - doFirst { - deleteFile(file("$testDir/paper/paperclip.jar")) - downloadPaperclip(purpurURL, "purpur") - } -} - -tasks.create("installPaper") { - group = "bukkit" - dependsOn("shadowJar") - doFirst { - installServer("paper") - // Downloading latest paper jar. - downloadPaperclip(paperURL, "paper") - } -} - -tasks.create("installPurpur") { - group = "bukkit" - dependsOn("shadowJar") - doFirst { - installServer("purpur") - // Downloading latest paper jar. - downloadPaperclip(purpurURL, "purpur") - } -} - -task(name = "runPaper") { - group = "bukkit" - standardInput = System.`in` - dependsOn("shadowJar") - // Copy Terra into dir - doFirst { - copyTerra("paper") +tasks { + shadowJar { + relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") + relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("com.google.common", "com.dfsek.terra.lib.google.common") + relocate("org.apache.logging.slf4j", "com.dfsek.terra.lib.slf4j-over-log4j") + exclude("org/slf4j/**") + exclude("org/checkerframework/**") + exclude("org/jetbrains/annotations/**") + exclude("org/intellij/**") + exclude("com/google/errorprone/**") + exclude("com/google/j2objc/**") + exclude("javax/**") } - mainClass.set("io.papermc.paperclip.Paperclip") - jvmArgs = jvmFlags - maxHeapSize = testMem - minHeapSize = testMem - args = listOf("nogui") - workingDir = file("$testDir/paper") - classpath = files("$testDir/paper/paperclip.jar") -} - -task(name = "runPurpur") { - group = "bukkit" - standardInput = System.`in` - dependsOn("shadowJar") - // Copy Terra into dir - doFirst { - copyTerra("purpur") + runServer { + minecraftVersion("1.19") + dependsOn(shadowJar) + pluginJars(shadowJar.get().archiveFile) } - - mainClass.set("io.papermc.paperclip.Paperclip") - jvmArgs = jvmFlags - maxHeapSize = testMem - minHeapSize = testMem - //args = listOf("nogui") - workingDir = file("$testDir/purpur") - classpath = files("$testDir/purpur/paperclip.jar") -} - -tasks.named("shadowJar") { - relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") - relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("com.google.common", "com.dfsek.terra.lib.google.common") - relocate("org.apache.logging.slf4j", "com.dfsek.terra.lib.slf4j-over-log4j") - exclude("org/slf4j/**") - exclude("org/checkerframework/**") - exclude("org/jetbrains/annotations/**") - exclude("org/intellij/**") - exclude("com/google/errorprone/**") - exclude("com/google/j2objc/**") - exclude("javax/**") } -addonDir(project.file("./target/server/paper/plugins/Terra/addons"), tasks.named("runPaper").get()) -addonDir(project.file("./target/server/purpur/plugins/Terra/addons"), tasks.named("runPurpur").get()) +addonDir(project.file("./target/server/paper/plugins/Terra/addons"), tasks.named("runServer").get()) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index a89870146..4020713db 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -1,13 +1,15 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.modrinth.minotaur.TaskModrinthUpload -import net.fabricmc.loom.task.RemapJarTask - plugins { id("fabric-loom") version Versions.Fabric.loom - id("com.modrinth.minotaur") version Versions.Fabric.minotaur id("io.github.juuxel.loom-quiltflower") version Versions.Fabric.loomQuiltflower } + +configurations { + val common by creating + compileClasspath.get().extendsFrom(common) + runtimeClasspath.get().extendsFrom(common) +} + dependencies { shadedApi(project(":common:implementation:base")) @@ -15,6 +17,9 @@ dependencies { "annotationProcessor"("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") "annotationProcessor"("net.fabricmc:fabric-loom:${Versions.Fabric.loom}") + "common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionFabric")) { isTransitive = false } + minecraft("com.mojang:minecraft:${Versions.Fabric.minecraft}") mappings("net.fabricmc:yarn:${Versions.Fabric.yarn}:v2") @@ -33,49 +38,22 @@ dependencies { loom { accessWidenerPath.set(file("src/main/resources/terra.accesswidener")) mixin { - defaultRefmapName.set("terra-refmap.json") + defaultRefmapName.set("terra-fabric-refmap.json") } } - addonDir(project.file("./run/config/Terra/addons"), tasks.named("runClient").get()) addonDir(project.file("./run/config/Terra/addons"), tasks.named("runServer").get()) -tasks.withType().configureEach { - options.release.set(17) -} -tasks.getByName("shadowJar") { - exclude("org/slf4j/**") +tasks { + compileJava { + options.release.set(17) + } + + remapJar { + inputFile.set(shadowJar.get().archiveFile) + archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar") + } } - -val remapped = tasks.register("remapShadedJar") { - dependsOn("installAddons") - group = "fabric" - val shadowJar = tasks.getByName("shadowJar") - dependsOn(shadowJar) - inputFile.set(shadowJar.archiveFile) - archiveFileName.set(shadowJar.archiveFileName.get().replace(Regex("-shaded\\.jar$"), "-shaded-mapped.jar")) - addNestedDependencies.set(true) -} - -tasks.named("assemble").configure { - dependsOn("remapShadedJar") -} - -tasks.withType { - finalizedBy(remapped) -} - -tasks.register("publishModrinth") { - dependsOn("remapShadedJar") - group = "fabric" - token = System.getenv("MODRINTH_SECRET") - projectId = "FIlZB9L0" - versionNumber = "${project.version}-fabric" - uploadFile = remapped.get().archiveFile.get().asFile - releaseType = "beta" - addGameVersion(Versions.Fabric.minecraft) - addLoader("fabric") -} \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java index 66348ed53..ca110eccf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java @@ -24,15 +24,19 @@ import cloud.commandframework.fabric.FabricServerCommandManager; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.fabric.util.BiomeUtil; +import com.dfsek.terra.mod.CommonPlatform; + import net.fabricmc.api.ModInitializer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; -import net.minecraft.world.gen.WorldPresets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dfsek.terra.fabric.data.Codecs; +import com.dfsek.terra.mod.data.Codecs; public class FabricEntryPoint implements ModInitializer { @@ -46,10 +50,17 @@ public class FabricEntryPoint implements ModInitializer { } public static void register() { // register the things - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.FABRIC_CHUNK_GENERATOR_WRAPPER); + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE); } + public static void initialize() { + getPlatform().getEventManager().callEvent( + new PlatformInitializationEvent()); + BiomeUtil.registerBiomes(); + CommonPlatform.get().registerWorldTypes((id, preset) -> BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, id, preset)); + } + @Override public void onInitialize() { logger.info("Initializing Terra Fabric mod..."); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java index fef99d2cd..66ddb8c67 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java @@ -20,17 +20,23 @@ package com.dfsek.terra.fabric; import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; -import com.dfsek.tectonic.api.TypeRegistry; -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; + import com.dfsek.terra.fabric.util.BiomeUtil; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.ModPlatform; + +import com.dfsek.terra.mod.generation.TerraBiomeSource; + +import com.dfsek.terra.mod.util.PresetUtil; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.MinecraftVersion; import net.minecraft.server.MinecraftServer; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; -import net.minecraft.world.biome.Biome.Precipitation; -import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGenerator; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,28 +45,28 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.function.BiConsumer; -import com.dfsek.terra.AbstractPlatform; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.handle.ItemHandle; import com.dfsek.terra.api.handle.WorldHandle; import com.dfsek.terra.api.util.generic.Lazy; -import com.dfsek.terra.api.world.biome.PlatformBiome; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.handle.FabricItemHandle; -import com.dfsek.terra.fabric.handle.FabricWorldHandle; -import com.dfsek.terra.fabric.util.ProtoPlatformBiome; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.handle.MinecraftItemHandle; +import com.dfsek.terra.mod.handle.MinecraftWorldHandle; -public class PlatformImpl extends AbstractPlatform { +public class PlatformImpl extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); - private final ItemHandle itemHandle = new FabricItemHandle(); - private final WorldHandle worldHandle = new FabricWorldHandle(); + private final ItemHandle itemHandle = new MinecraftItemHandle(); + private final WorldHandle worldHandle = new MinecraftWorldHandle(); private final Lazy dataFolder = Lazy.lazy(() -> new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra")); private MinecraftServer server; public PlatformImpl() { + CommonPlatform.initialize(this); load(); } @@ -68,6 +74,7 @@ public class PlatformImpl extends AbstractPlatform { this.server = server; } + @Override public MinecraftServer getServer() { return server; } @@ -86,7 +93,7 @@ public class PlatformImpl extends AbstractPlatform { }).join(); BiomeUtil.registerBiomes(); server.getWorlds().forEach(world -> { - if(world.getChunkManager().getChunkGenerator() instanceof FabricChunkGeneratorWrapper chunkGeneratorWrapper) { + if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { chunkGeneratorWrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for world {}", world); @@ -101,7 +108,7 @@ public class PlatformImpl extends AbstractPlatform { protected Iterable platformAddon() { List addons = new ArrayList<>(); - addons.add(new FabricAddon(this)); + super.platformAddon().forEach(addons::add); String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); try { @@ -150,27 +157,4 @@ public class PlatformImpl extends AbstractPlatform { public @NotNull ItemHandle getItemHandle() { return itemHandle; } - - @Override - public void register(TypeRegistry registry) { - super.register(registry); - registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)) - .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { - Identifier identifier = Identifier.tryParse((String) o); - if(identifier == null) - throw new LoadException("Invalid identifier: " + o, depthTracker); - return identifier; - }) - .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( - Locale.ROOT))) - .registerLoader(GrassColorModifier.class, (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( - Locale.ROOT))); - } - - - private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { - Identifier identifier = Identifier.tryParse(id); - if(BuiltinRegistries.BIOME.get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. - return new ProtoPlatformBiome(identifier); - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/ChunkRegionAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/ChunkRegionAccessor.java deleted file mode 100644 index 2c471cf0e..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/ChunkRegionAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.fabric.mixin.access; - -import net.minecraft.world.ChunkRegion; -import net.minecraft.world.chunk.Chunk; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - - -@Mixin(ChunkRegion.class) -public interface ChunkRegionAccessor { - @Accessor("chunks") - List getChunks(); -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java index 6f9af2ed8..b24bfd489 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/NoiseConfigMixin.java @@ -1,10 +1,9 @@ package com.dfsek.terra.fabric.mixin.lifecycle; -import com.dfsek.terra.fabric.util.SeedHack; +import com.dfsek.terra.mod.util.SeedHack; import net.minecraft.util.math.noise.DoublePerlinNoiseSampler; import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.source.util.MultiNoiseUtil; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.noise.NoiseConfig; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java index 620ebf100..b605d8cdb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java @@ -17,8 +17,6 @@ package com.dfsek.terra.fabric.mixin.lifecycle.client; -import com.dfsek.terra.fabric.util.LifecycleUtil; - import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; import org.spongepowered.asm.mixin.Mixin; @@ -26,9 +24,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.util.BiomeUtil; @Mixin(MinecraftClient.class) @@ -40,6 +36,6 @@ public class MinecraftClientMixin { // sorta arbitrary position, after mod init, before window opens shift = At.Shift.BEFORE)) public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - LifecycleUtil.initialize(); + FabricEntryPoint.initialize(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java index ecf5e933b..16e107631 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java @@ -17,16 +17,12 @@ package com.dfsek.terra.fabric.mixin.lifecycle.server; -import com.dfsek.terra.fabric.util.BiomeUtil; -import com.dfsek.terra.fabric.util.LifecycleUtil; - import net.minecraft.server.Main; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.fabric.FabricEntryPoint; @@ -39,6 +35,6 @@ public class ServerMainMixin { // after registry manager creation ) private static void injectConstructor(String[] args, CallbackInfo ci) { - LifecycleUtil.initialize(); + FabricEntryPoint.initialize(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java index 421b321f4..769c9e65b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java @@ -3,18 +3,15 @@ package com.dfsek.terra.fabric.util; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; -import com.dfsek.terra.fabric.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; + +import com.dfsek.terra.mod.config.ProtoPlatformBiome; +import com.dfsek.terra.mod.util.MinecraftUtil; -import com.dfsek.terra.fabric.mixin_ifaces.FloraFeatureHolder; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.biome.Biome.Builder; -import net.minecraft.world.biome.BiomeEffects; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.feature.ConfiguredFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,25 +21,17 @@ import java.util.*; public final class BiomeUtil { private static final Logger logger = LoggerFactory.getLogger(BiomeUtil.class); - private static final Map> - TERRA_BIOME_MAP = new HashMap<>(); - private BiomeUtil() { } - public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { - return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); - } - public static void registerBiomes() { logger.info("Registering biomes..."); FabricEntryPoint.getPlatform().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id)); }); - registerFlora(BuiltinRegistries.BIOME); + MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); logger.info("Terra biomes registered."); } @@ -61,108 +50,23 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); } else { - net.minecraft.world.biome.Biome minecraftBiome = createBiome(biome, registry.get(vanilla)); + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla)); - Identifier identifier = new Identifier("terra", createBiomeID(pack, id)); + Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); if(registry.containsId(identifier)) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(FabricUtil.getEntry(registry, identifier) - .orElseThrow() - .getKey() - .orElseThrow()); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(MinecraftUtil.getEntry(registry, identifier) + .orElseThrow() + .getKey() + .orElseThrow()); } else { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(BuiltinRegistries.add(registry, - registerKey(identifier).getValue(), + MinecraftUtil.registerKey(identifier).getValue(), minecraftBiome).getKey().orElseThrow()); } - TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); } } - public static void registerFlora(Registry biomes) { - logger.info("Injecting flora into Terra biomes..."); - TERRA_BIOME_MAP - .forEach((vb, terraBiomes) -> - biomes.getOrEmpty(vb) - .ifPresentOrElse(vanilla -> terraBiomes - .forEach(tb -> biomes.getOrEmpty(tb) - .ifPresentOrElse( - terra -> { - List> flowerFeatures = List.copyOf(vanilla.getGenerationSettings().getFlowerFeatures()); - logger.debug("Injecting flora into biome {} : {}", tb, flowerFeatures); - ((FloraFeatureHolder) terra.getGenerationSettings()).setFloraFeatures(flowerFeatures); - }, - () -> logger.error( - "No such biome: {}", - tb))), - () -> logger.error("No vanilla biome: {}", vb))); - - } - - public static Map> getTerraBiomeMap() { - return Map.copyOf(TERRA_BIOME_MAP); - } - - private static RegistryKey registerKey(Identifier identifier) { - return RegistryKey.of(Registry.BIOME_KEY, identifier); - } - - public static net.minecraft.world.biome.Biome createBiome(Biome biome, net.minecraft.world.biome.Biome vanilla) { - GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); - - BiomeEffects.Builder effects = new BiomeEffects.Builder(); - - net.minecraft.world.biome.Biome.Builder builder = new Builder(); - - if(biome.getContext().has(VanillaBiomeProperties.class)) { - VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - .fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())) - .grassColorModifier( - Objects.requireNonNullElse(vanillaBiomeProperties.getModifier(), vanilla.getEffects().getGrassColorModifier())); - - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor); - } else { - effects.grassColor(vanillaBiomeProperties.getGrassColor()); - } - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor); - } else { - effects.foliageColor(vanillaBiomeProperties.getFoliageColor()); - } - - builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.getPrecipitation())); - - } else { - effects.waterColor(vanilla.getWaterColor()) - .waterFogColor(vanilla.getWaterFogColor()) - .fogColor(vanilla.getFogColor()) - .skyColor(vanilla.getSkyColor()); - vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor); - vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor); - - builder.precipitation(vanilla.getPrecipitation()); - } - - vanilla.getLoopSound().ifPresent(effects::loopSound); - vanilla.getAdditionsSound().ifPresent(effects::additionsSound); - vanilla.getMoodSound().ifPresent(effects::moodSound); - vanilla.getMusic().ifPresent(effects::music); - vanilla.getParticleConfig().ifPresent(effects::particleConfig); - - return builder - .temperature(vanilla.getTemperature()) - .downfall(vanilla.getDownfall()) - .effects(effects.build()) - .spawnSettings(vanilla.getSpawnSettings()) - .generationSettings(generationSettings.build()) - .build(); - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java deleted file mode 100644 index da6c3f6f8..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.fabric.util; - -import net.minecraft.block.enums.BlockHalf; -import net.minecraft.block.enums.WallShape; -import net.minecraft.block.enums.WireConnection; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.HeightLimitView; - -import com.dfsek.terra.api.block.state.properties.enums.Axis; -import com.dfsek.terra.api.block.state.properties.enums.Half; -import com.dfsek.terra.api.block.state.properties.enums.RailShape; -import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection; -import com.dfsek.terra.api.block.state.properties.enums.WallHeight; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.world.info.WorldProperties; - - -public final class FabricAdapter { - public static BlockPos adapt(Vector3 v) { - return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ()); - } - - public static Vector3 adapt(BlockPos pos) { - return Vector3.of(pos.getX(), pos.getY(), pos.getZ()); - } - - public static Direction adapt(com.dfsek.terra.api.block.state.properties.enums.Direction direction) { - return switch(direction) { - case SOUTH -> Direction.SOUTH; - case NORTH -> Direction.NORTH; - case WEST -> Direction.WEST; - case EAST -> Direction.EAST; - case UP -> Direction.UP; - case DOWN -> Direction.DOWN; - }; - } - - public static WorldProperties adapt(HeightLimitView height, long seed) { - return new WorldProperties() { - @Override - public long getSeed() { - return seed; - } - - @Override - public int getMaxHeight() { - return height.getTopY(); - } - - @Override - public int getMinHeight() { - return height.getBottomY(); - } - - @Override - public Object getHandle() { - return height; - } - }; - } - - public static com.dfsek.terra.api.block.state.properties.enums.Direction adapt(Direction direction) { - return switch(direction) { - case SOUTH -> com.dfsek.terra.api.block.state.properties.enums.Direction.SOUTH; - case NORTH -> com.dfsek.terra.api.block.state.properties.enums.Direction.NORTH; - case WEST -> com.dfsek.terra.api.block.state.properties.enums.Direction.WEST; - case EAST -> com.dfsek.terra.api.block.state.properties.enums.Direction.EAST; - case UP -> com.dfsek.terra.api.block.state.properties.enums.Direction.UP; - case DOWN -> com.dfsek.terra.api.block.state.properties.enums.Direction.DOWN; - }; - } - - public static WallHeight adapt(WallShape shape) { - return switch(shape) { - case LOW -> WallHeight.LOW; - case NONE -> WallHeight.NONE; - case TALL -> WallHeight.TALL; - }; - } - - public static WallShape adapt(WallHeight shape) { - return switch(shape) { - case LOW -> WallShape.LOW; - case NONE -> WallShape.NONE; - case TALL -> WallShape.TALL; - }; - } - - public static RedstoneConnection adapt(WireConnection connection) { - return switch(connection) { - case NONE -> RedstoneConnection.NONE; - case UP -> RedstoneConnection.UP; - case SIDE -> RedstoneConnection.SIDE; - }; - } - - public static WireConnection adapt(RedstoneConnection connection) { - return switch(connection) { - case NONE -> WireConnection.NONE; - case UP -> WireConnection.UP; - case SIDE -> WireConnection.SIDE; - }; - } - - - public static Half adapt(BlockHalf half) { - return switch(half) { - case BOTTOM -> Half.BOTTOM; - case TOP -> Half.TOP; - }; - } - - public static BlockHalf adapt(Half half) { - return switch(half) { - case TOP -> BlockHalf.TOP; - case BOTTOM -> BlockHalf.BOTTOM; - default -> throw new IllegalStateException(); - }; - } - - public static RailShape adapt(net.minecraft.block.enums.RailShape railShape) { - return switch(railShape) { - case EAST_WEST -> RailShape.EAST_WEST; - case NORTH_EAST -> RailShape.NORTH_EAST; - case NORTH_WEST -> RailShape.NORTH_WEST; - case SOUTH_EAST -> RailShape.SOUTH_EAST; - case SOUTH_WEST -> RailShape.SOUTH_WEST; - case NORTH_SOUTH -> RailShape.NORTH_SOUTH; - case ASCENDING_EAST -> RailShape.ASCENDING_EAST; - case ASCENDING_NORTH -> RailShape.ASCENDING_NORTH; - case ASCENDING_SOUTH -> RailShape.ASCENDING_SOUTH; - case ASCENDING_WEST -> RailShape.ASCENDING_WEST; - }; - } - - public static net.minecraft.block.enums.RailShape adapt(RailShape railShape) { - return switch(railShape) { - case EAST_WEST -> net.minecraft.block.enums.RailShape.EAST_WEST; - case NORTH_EAST -> net.minecraft.block.enums.RailShape.NORTH_EAST; - case NORTH_WEST -> net.minecraft.block.enums.RailShape.NORTH_WEST; - case SOUTH_EAST -> net.minecraft.block.enums.RailShape.SOUTH_EAST; - case SOUTH_WEST -> net.minecraft.block.enums.RailShape.SOUTH_WEST; - case NORTH_SOUTH -> net.minecraft.block.enums.RailShape.NORTH_SOUTH; - case ASCENDING_EAST -> net.minecraft.block.enums.RailShape.ASCENDING_EAST; - case ASCENDING_NORTH -> net.minecraft.block.enums.RailShape.ASCENDING_NORTH; - case ASCENDING_SOUTH -> net.minecraft.block.enums.RailShape.ASCENDING_SOUTH; - case ASCENDING_WEST -> net.minecraft.block.enums.RailShape.ASCENDING_WEST; - }; - } - - - public static Axis adapt(Direction.Axis axis) { - return switch(axis) { - case X -> Axis.X; - case Y -> Axis.Y; - case Z -> Axis.Z; - }; - } - - public static Direction.Axis adapt(Axis axis) { - return switch(axis) { - case Z -> Direction.Axis.Z; - case Y -> Direction.Axis.Y; - case X -> Direction.Axis.X; - }; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java deleted file mode 100644 index 7e00aa900..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.fabric.util; - -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryEntry; -import net.minecraft.world.WorldAccess; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Optional; - -import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.api.block.entity.Container; -import com.dfsek.terra.api.block.entity.MobSpawner; -import com.dfsek.terra.api.block.entity.Sign; - - -public final class FabricUtil { - private FabricUtil() { - - } - - public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { - net.minecraft.block.entity.BlockEntity entity = worldAccess.getBlockEntity(pos); - if(entity instanceof SignBlockEntity) { - return (Sign) entity; - } else if(entity instanceof MobSpawnerBlockEntity) { - return (MobSpawner) entity; - } else if(entity instanceof LootableContainerBlockEntity) { - return (Container) entity; - } - return null; - } - - public static Optional> getEntry(Registry registry, Identifier identifier) { - return registry.getOrEmpty(identifier) - .flatMap(registry::getKey) - .map(registry::getOrCreateEntry); - } -} diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index dcc277954..e6e490c1a 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -21,7 +21,7 @@ ] }, "mixins": [ - "terra.mixins.json" + "terra.fabric.mixins.json" ], "depends": { "fabricloader": ">=0.14.2", diff --git a/platforms/fabric/src/main/resources/terra.fabric.mixins.json b/platforms/fabric/src/main/resources/terra.fabric.mixins.json new file mode 100644 index 000000000..52882ee43 --- /dev/null +++ b/platforms/fabric/src/main/resources/terra.fabric.mixins.json @@ -0,0 +1,21 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "lifecycle.MinecraftServerMixin", + "lifecycle.NoiseConfigMixin", + "lifecycle.RegistryMixin" + ], + "client": [ + "lifecycle.client.MinecraftClientMixin" + ], + "server": [ + "lifecycle.server.ServerMainMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra-fabric-refmap.json" +} \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json deleted file mode 100644 index 4e8614ba3..000000000 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.fabric.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "access.ChunkRegionAccessor", - "access.MobSpawnerLogicAccessor", - "access.StateAccessor", - "access.StructureAccessorAccessor", - "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", - "fix.NetherFossilOptimization", - "implementations.compat.GenerationSettingsFloraFeaturesMixin", - "implementations.terra.BiomeMixin", - "implementations.terra.HandleImplementationMixin", - "implementations.terra.block.BlockMixin", - "implementations.terra.block.entity.BlockEntityMixin", - "implementations.terra.block.entity.LootableContainerBlockEntityMixin", - "implementations.terra.block.entity.MobSpawnerBlockEntityMixin", - "implementations.terra.block.entity.SignBlockEntityMixin", - "implementations.terra.block.state.BlockStateMixin", - "implementations.terra.block.state.PropertyMixin", - "implementations.terra.chunk.ChunkRegionMixin", - "implementations.terra.chunk.WorldChunkMixin", - "implementations.terra.chunk.data.ProtoChunkMixin", - "implementations.terra.entity.EntityMixin", - "implementations.terra.entity.EntityTypeMixin", - "implementations.terra.entity.PlayerEntityMixin", - "implementations.terra.entity.ServerCommandSourceMixin", - "implementations.terra.inventory.LockableContainerBlockEntityMixin", - "implementations.terra.inventory.item.ItemMixin", - "implementations.terra.inventory.item.ItemStackMixin", - "implementations.terra.inventory.meta.EnchantmentMixin", - "implementations.terra.inventory.meta.ItemStackDamageableMixin", - "implementations.terra.inventory.meta.ItemStackMetaMixin", - "implementations.terra.world.ChunkRegionMixin", - "implementations.terra.world.ServerWorldMixin", - "lifecycle.DataPackContentsMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.NoiseConfigMixin", - "lifecycle.RegistryMixin" - ], - "client": [ - "lifecycle.client.MinecraftClientMixin" - ], - "server": [ - "lifecycle.server.ServerMainMixin" - ], - "injectors": { - "defaultRequire": 1 - }, - "refmap": "terra-refmap.json" -} \ No newline at end of file diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts new file mode 100644 index 000000000..b09a9a1b1 --- /dev/null +++ b/platforms/forge/build.gradle.kts @@ -0,0 +1,67 @@ +plugins { + id("dev.architectury.loom") version Versions.Forge.architecuryLoom + id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("io.github.juuxel.loom-quiltflower") version Versions.Fabric.loomQuiltflower +} + +architectury { + platformSetupLoomIde() + forge() +} + +configurations { + val common by creating + compileClasspath.get().extendsFrom(common) + runtimeClasspath.get().extendsFrom(common) +} + +dependencies { + shadedApi(project(":common:implementation:base")) + + "common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionForge")) { isTransitive = false } + "developmentForge"(project(":platforms:mixin-common", configuration = "namedElements")) { + isTransitive = false + } + + + forge(group = "net.minecraftforge", name = "forge", version = Versions.Forge.forge) + + minecraft("com.mojang:minecraft:${Versions.Forge.minecraft}") + mappings("net.fabricmc:yarn:${Versions.Forge.yarn}:v2") +} + +loom { + mixin { + defaultRefmapName.set("terra-forge-refmap.json") + } + + forge { + mixinConfig("terra.common.mixins.json") + mixinConfig("terra.forge.mixins.json") + } +} + + + +tasks { + jar { + manifest { + attributes( + mapOf( + "Implementation-Title" to rootProject.name, + "Implementation-Version" to project.version, + ) + ) + } + } + + shadowJar { + exclude("fabric.mod.json") + } + + remapJar { + inputFile.set(shadowJar.get().archiveFile) + archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar") + } +} diff --git a/platforms/forge/gradle.properties b/platforms/forge/gradle.properties new file mode 100644 index 000000000..82425854e --- /dev/null +++ b/platforms/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform=forge diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/AwfulForgeHacks.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/AwfulForgeHacks.java new file mode 100644 index 000000000..0ddb92caa --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/AwfulForgeHacks.java @@ -0,0 +1,108 @@ +package com.dfsek.terra.forge; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.FileVisitOption; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.jar.JarFile; +import java.util.stream.Stream; + + +/** + * Forge is really wacky and screws with class resolution in the addon loader. Loading every single Terra class *manually* on startup + * fixes it. If you know of a better way to fix this, PLEASE let us know. + */ +public final class AwfulForgeHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulForgeHacks.class); + + /** + * Forge tampers with code source to make the *normal* way of getting the current JAR file useless, so this awful hack is + * needed. + * + * + * Class.class.getProtectionDomain() + * .getCodeSource() + * .getLocation() + * .toURI() + * .getPath() + * + */ + public static JarFile getTerraJar() throws IOException { + LOGGER.info("Scanning for Terra JAR..."); + return Files.walk(Path.of("./", "mods"), 1, FileVisitOption.FOLLOW_LINKS) + .filter(it -> it.getFileName().toString().endsWith(".jar")) + .peek(path -> LOGGER.info("Found mod: {}", path)) + .map(Path::toFile) + .flatMap(path -> { + try { + return Stream.of(new JarFile(path)); + } catch(IOException e) { + LOGGER.error("Malformed mod JAR: {}: {}", path, e); + return Stream.of(); + } + }) + .filter(jar -> jar + .stream() + .anyMatch(entry -> entry + .getName() + .equals(ForgeEntryPoint.class.getName().replace('.', '/') + ".class"))) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Could not find Terra JAR")); + + } + + public static void loadAllTerraClasses() { + + try(JarFile jar = getTerraJar()) { + jar.stream() + .forEach(jarEntry -> { + if(jarEntry.getName().startsWith("com/dfsek/terra/forge/mixin") + || jarEntry.getName().startsWith("com/dfsek/terra/mod/mixin")) { + return; + } + if(jarEntry.getName().endsWith(".class")) { + String name = jarEntry.getName().replace('/', '.'); + name = name.substring(0, name.length() - 6); + try { + Class.forName(name); + } catch(ClassNotFoundException | NoClassDefFoundError e) { + LOGGER.warn("Failed to load class {}: {}", name, e); + } + } + }); + } catch(IOException e) { + throw new IllegalStateException("Could not load all Terra classes", e); + } + } + + public enum RegistryStep { + BLOCK, + BIOME, + WORLD_TYPE, + DONE; + } + + + public static class RegistrySanityCheck { + private final AtomicReference step = new AtomicReference<>(RegistryStep.BLOCK); + + public void progress(RegistryStep expected, Runnable action) { + step.getAndUpdate(s -> { + if(s != expected) { + LOGGER.error("Registry sanity check failed, expected to find {}, found {}", expected, step); + } + action.run(); + RegistryStep[] registrySteps = RegistryStep.values(); + if(s.ordinal() < registrySteps.length - 1) { + return registrySteps[s.ordinal() + 1]; + } + return s; + }); + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java new file mode 100644 index 000000000..dbc919781 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeEntryPoint.java @@ -0,0 +1,85 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +package com.dfsek.terra.forge; + +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.forge.util.BiomeUtil; + +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.ForgeRegistries.Keys; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegisterEvent.RegisterHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.dfsek.terra.forge.AwfulForgeHacks.RegistrySanityCheck; +import com.dfsek.terra.forge.AwfulForgeHacks.RegistryStep; +import com.dfsek.terra.mod.data.Codecs; + + +@Mod("terra") +@EventBusSubscriber(bus = Bus.MOD) +public class ForgeEntryPoint { + private final RegistrySanityCheck sanityCheck = new RegistrySanityCheck(); + + static { + AwfulForgeHacks.loadAllTerraClasses(); + TERRA_PLUGIN = new PlatformImpl(); + } + + public static final String MODID = "terra"; + + private static final Logger logger = LoggerFactory.getLogger(ForgeEntryPoint.class); + + private static final PlatformImpl TERRA_PLUGIN; + + public static PlatformImpl getPlatform() { + return TERRA_PLUGIN; + } + + public ForgeEntryPoint() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.register(this); + } + + public static void initialize(RegisterHelper helper) { + getPlatform().getEventManager().callEvent( + new PlatformInitializationEvent()); + BiomeUtil.registerBiomes(helper); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void registerBiomes(RegisterEvent event) { + event.register(Keys.BLOCKS, helper -> sanityCheck.progress(RegistryStep.BLOCK, () -> logger.debug("Block registration detected."))); + event.register(Keys.BIOMES, helper -> sanityCheck.progress(RegistryStep.BIOME, () -> initialize(helper))); + event.register(Registry.WORLD_PRESET_KEY, helper -> sanityCheck.progress(RegistryStep.WORLD_TYPE, () -> TERRA_PLUGIN.registerWorldTypes(helper::register))); + + + event.register(Registry.CHUNK_GENERATOR_KEY, helper -> helper.register(new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER)); + event.register(Registry.BIOME_SOURCE_KEY, helper -> helper.register(new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java new file mode 100644 index 000000000..b3996a9d8 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/PlatformImpl.java @@ -0,0 +1,141 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +package com.dfsek.terra.forge; + +import ca.solostudios.strata.Versions; +import ca.solostudios.strata.parser.tokenizer.ParseException; +import ca.solostudios.strata.version.Version; + +import com.dfsek.terra.mod.util.PresetUtil; + +import net.minecraft.MinecraftVersion; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; +import net.minecraft.world.gen.WorldPreset; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.server.ServerLifecycleHooks; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +import com.dfsek.terra.addon.EphemeralAddon; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.handle.WorldHandle; +import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.handle.MinecraftItemHandle; +import com.dfsek.terra.mod.handle.MinecraftWorldHandle; + + +public class PlatformImpl extends ModPlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(PlatformImpl.class); + private final ItemHandle itemHandle = new MinecraftItemHandle(); + private final WorldHandle worldHandle = new MinecraftWorldHandle(); + private final Lazy dataFolder = Lazy.lazy(() -> new File("./config/Terra")); + + public PlatformImpl() { + CommonPlatform.initialize(this); + load(); + } + + @Override + public MinecraftServer getServer() { + return ServerLifecycleHooks.getCurrentServer(); + } + + @Override + public boolean reload() { + getTerraConfig().load(this); + getRawConfigRegistry().clear(); + boolean succeed = getRawConfigRegistry().loadAll(this); + + MinecraftServer server = getServer(); + + if(server != null) { + server.reloadResources(server.getDataPackManager().getNames()).exceptionally(throwable -> { + LOGGER.warn("Failed to execute reload", throwable); + return null; + }).join(); + //BiomeUtil.registerBiomes(); + server.getWorlds().forEach(world -> { + if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { + getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { + chunkGeneratorWrapper.setPack(pack); + LOGGER.info("Replaced pack in chunk generator for world {}", world); + }); + } + }); + } + return succeed; + } + + @Override + protected Iterable platformAddon() { + List addons = new ArrayList<>(); + + super.platformAddon().forEach(addons::add); + + String mcVersion = MinecraftVersion.CURRENT.getReleaseTarget(); + try { + addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion), "minecraft")); + } catch(ParseException e) { + try { + addons.add(new EphemeralAddon(Versions.parseVersion(mcVersion + ".0"), "minecraft")); + } catch(ParseException ex) { + LOGGER.warn("Failed to parse Minecraft version", e); + } + } + + FMLLoader.getLoadingModList().getMods().forEach(mod -> { + String id = mod.getModId(); + if(id.equals("terra") || id.equals("minecraft") || id.equals("java")) return; + Version version = Versions.getVersion(mod.getVersion().getMajorVersion(), mod.getVersion().getMinorVersion(), mod.getVersion().getIncrementalVersion()); + addons.add(new EphemeralAddon(version, "forge:" + id)); + }); + + return addons; + } + + @Override + public @NotNull String platformName() { + return "Forge"; + } + + @Override + public @NotNull WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public @NotNull File getDataFolder() { + return dataFolder.value(); + } + + @Override + public @NotNull ItemHandle getItemHandle() { + return itemHandle; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java new file mode 100644 index 000000000..41a113f9e --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/NoiseConfigMixin.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.forge.mixin.lifecycle; + +import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; +import net.minecraft.world.biome.source.util.MultiNoiseUtil.NoiseHypercube; +import net.minecraft.world.gen.densityfunction.DensityFunction; +import net.minecraft.world.gen.noise.NoiseConfig; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; + +import com.dfsek.terra.mod.util.SeedHack; + + +/** + * Hack to map noise sampler to seeds + */ +@Mixin(NoiseConfig.class) +public class NoiseConfigMixin { + @Shadow + @Final + private long legacyWorldSeed; + + @Redirect(method = "(Lnet/minecraft/world/gen/chunk/ChunkGeneratorSettings;Lnet/minecraft/util/registry/Registry;J)V", at = @At(value = "NEW", target = "(Lnet/minecraft/world/gen/densityfunction/DensityFunction;Lnet/minecraft/world/gen/densityfunction/DensityFunction;Lnet/minecraft/world/gen/densityfunction/DensityFunction;Lnet/minecraft/world/gen/densityfunction/DensityFunction;Lnet/minecraft/world/gen/densityfunction/DensityFunction;Lnet/minecraft/world/gen/densityfunction/DensityFunction;Ljava/util/List;)Lnet/minecraft/world/biome/source/util/MultiNoiseUtil$MultiNoiseSampler;")) + private MultiNoiseSampler t(DensityFunction densityFunction, DensityFunction densityFunction2, DensityFunction densityFunction3, + DensityFunction densityFunction4, DensityFunction densityFunction5, DensityFunction densityFunction6, + List list) { + MultiNoiseSampler sampler = new MultiNoiseSampler(densityFunction, densityFunction2, densityFunction3, densityFunction4, + densityFunction5, densityFunction6, list); + SeedHack.register(sampler, legacyWorldSeed); + return sampler; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/package-info.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/package-info.java new file mode 100644 index 000000000..eba8981f7 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/lifecycle/package-info.java @@ -0,0 +1,22 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +/** + * Mixins that inject behavior into the client/server lifecycle. + */ + +package com.dfsek.terra.forge.mixin.lifecycle; \ No newline at end of file diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java new file mode 100644 index 000000000..28fe88ec2 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/util/BiomeUtil.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.forge.util; + +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.RegistryKey; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent.RegisterHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.forge.ForgeEntryPoint; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.mod.config.ProtoPlatformBiome; +import com.dfsek.terra.mod.util.MinecraftUtil; + + +public final class BiomeUtil { + private static final Logger logger = LoggerFactory.getLogger(BiomeUtil.class); + + + private BiomeUtil() { + + } + + + public static void registerBiomes(RegisterHelper helper) { + logger.info("Registering biomes..."); + ForgeEntryPoint.getPlatform().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. + pack.getCheckedRegistry(Biome.class) + .forEach((id, biome) -> registerBiome(biome, pack, id, helper)); + }); + MinecraftUtil.registerFlora(BuiltinRegistries.BIOME); + logger.info("Terra biomes registered."); + } + + /** + * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. + * + * @param biome The Terra BiomeBuilder. + * @param pack The ConfigPack this biome belongs to. + */ + private static void registerBiome(Biome biome, ConfigPack pack, + com.dfsek.terra.api.registry.key.RegistryKey id, RegisterHelper helper) { + RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(BuiltinRegistries.BIOME); + + + if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); + } else { + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla).value()); + + Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); + + if(ForgeRegistries.BIOMES.containsKey(identifier)) { + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier).orElseThrow().getKey().orElseThrow()); + } else { + helper.register(MinecraftUtil.registerKey(identifier).getValue(), minecraftBiome); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier).orElseThrow().getKey().orElseThrow()); + } + + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); + } + } +} diff --git a/platforms/forge/src/main/resources/META-INF/mods.toml b/platforms/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 000000000..ae314f8d3 --- /dev/null +++ b/platforms/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,24 @@ +modLoader = "javafml" +loaderVersion = "[41,)" +license = "GNU General Public License, v3.0" +issueTrackerURL="https://github.com/PolyhedralDev/Terra/issues" + +[[mods]] +modId = "terra" +version = "@VERSION@" +displayName = "Terra" +description = "@DESCRIPTION@" + +[[dependencies.terra]] +modId = "forge" +mandatory = true +versionRange = "[41,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.terra]] +modId = "minecraft" +mandatory = true +versionRange = "[1.19,)" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/platforms/forge/src/main/resources/pack.mcmeta b/platforms/forge/src/main/resources/pack.mcmeta new file mode 100644 index 000000000..3dc15cc76 --- /dev/null +++ b/platforms/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Terra Resources", + "pack_format": 9 + } +} diff --git a/platforms/forge/src/main/resources/terra.forge.mixins.json b/platforms/forge/src/main/resources/terra.forge.mixins.json new file mode 100644 index 000000000..355d77483 --- /dev/null +++ b/platforms/forge/src/main/resources/terra.forge.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.forge.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "lifecycle.NoiseConfigMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra-forge-refmap.json" +} \ No newline at end of file diff --git a/platforms/mixin-common/README.md b/platforms/mixin-common/README.md new file mode 100644 index 000000000..f92b8b043 --- /dev/null +++ b/platforms/mixin-common/README.md @@ -0,0 +1,4 @@ +# mixin-common + +This project contains mixins shared between Forge & Fabric, as +well as glue code. \ No newline at end of file diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts new file mode 100644 index 000000000..33a503818 --- /dev/null +++ b/platforms/mixin-common/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("dev.architectury.loom") version Versions.Mod.architecuryLoom + id("architectury-plugin") version Versions.Mod.architectutyPlugin +} + +loom { + mixin { + defaultRefmapName.set("terra-common-refmap.json") + } +} + +dependencies { + shadedApi(project(":common:implementation:base")) + + modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") + + minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") + mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") +} + +architectury { + common("fabric", "forge") + minecraft = Versions.Mod.minecraft +} \ No newline at end of file diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/CommonPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/CommonPlatform.java new file mode 100644 index 000000000..97534c8b1 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/CommonPlatform.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.mod; + +import java.util.concurrent.atomic.AtomicReference; + + +public final class CommonPlatform { + private static final AtomicReference platform = new AtomicReference<>(); + + public static ModPlatform get() { + ModPlatform modPlatform = platform.get(); + + if(modPlatform == null) { + throw new IllegalStateException("Platform is not yet initialised!"); + } + + return modPlatform; + } + + public static void initialize(ModPlatform modPlatform) { + if(!platform.compareAndSet(null, modPlatform)) { + throw new IllegalStateException("Platform has already been initialized to " + platform.get()); + } + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java similarity index 55% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java index 347244a54..76b13b137 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric; +package com.dfsek.terra.mod; import ca.solostudios.strata.Versions; import ca.solostudios.strata.version.Version; @@ -28,44 +28,44 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; -import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; -import com.dfsek.terra.fabric.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.config.PostLoadCompatibilityOptions; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.mod.config.VanillaBiomeProperties; -public final class FabricAddon implements BaseAddon { +public final class MinecraftAddon implements BaseAddon { private static final Version VERSION = Versions.getVersion(1, 0, 0); - private static final Logger logger = LoggerFactory.getLogger(FabricAddon.class); - private final PlatformImpl terraFabricPlugin; + private static final Logger logger = LoggerFactory.getLogger(MinecraftAddon.class); + private final ModPlatform modPlatform; - public FabricAddon(PlatformImpl terraFabricPlugin) { - this.terraFabricPlugin = terraFabricPlugin; + public MinecraftAddon(ModPlatform modPlatform) { + this.modPlatform = modPlatform; } @Override public void initialize() { - terraFabricPlugin.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack().getContext().put(event.loadTemplate(new PreLoadCompatibilityOptions()))) - .global(); + modPlatform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack().getContext().put(event.loadTemplate(new PreLoadCompatibilityOptions()))) + .global(); - terraFabricPlugin.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigPackPostLoadEvent.class) - .then(event -> event.getPack().getContext().put(event.loadTemplate(new PostLoadCompatibilityOptions()))) - .priority(100) - .global(); + modPlatform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPostLoadEvent.class) + .then(event -> event.getPack().getContext().put(event.loadTemplate(new PostLoadCompatibilityOptions()))) + .priority(100) + .global(); - terraFabricPlugin.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationLoadEvent.class) - .then(event -> { + modPlatform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { if(event.is(Biome.class)) { event.getLoadedObject(Biome.class).getContext().put(event.load(new VanillaBiomeProperties())); } }) - .global(); + .global(); } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java new file mode 100644 index 000000000..5a75d0cc2 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.mod; + +import com.dfsek.tectonic.api.TypeRegistry; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; + +import com.dfsek.terra.AbstractPlatform; + +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.world.biome.PlatformBiome; + +import com.dfsek.terra.mod.config.ProtoPlatformBiome; + +import com.dfsek.terra.mod.util.PresetUtil; + +import net.minecraft.command.CommandSource; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.Biome.Precipitation; +import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; +import net.minecraft.world.gen.WorldPreset; + +import java.util.List; +import java.util.Locale; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + + +public abstract class ModPlatform extends AbstractPlatform { + public abstract MinecraftServer getServer(); + + public void registerWorldTypes(BiConsumer registerFunction) { + getRawConfigRegistry() + .forEach(pack -> PresetUtil.createDefault(pack).apply(registerFunction)); + } + + @Override + public void register(TypeRegistry registry) { + super.register(registry); + registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)) + .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> { + Identifier identifier = Identifier.tryParse((String) o); + if(identifier == null) + throw new LoadException("Invalid identifier: " + o, depthTracker); + return identifier; + }) + .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))); + } + + private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { + Identifier identifier = Identifier.tryParse(id); + if(BuiltinRegistries.BIOME.get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + return new ProtoPlatformBiome(identifier); + } + + @Override + protected Iterable platformAddon() { + return List.of(new MinecraftAddon(this)); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PostLoadCompatibilityOptions.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PostLoadCompatibilityOptions.java index 9a13e0029..a8b457bf5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PostLoadCompatibilityOptions.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PostLoadCompatibilityOptions.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.config; +package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.ConfigTemplate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java index 8533ef1a0..00825bc5f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/PreLoadCompatibilityOptions.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/PreLoadCompatibilityOptions.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.config; +package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Default; @@ -26,19 +26,19 @@ import com.dfsek.terra.api.properties.Properties; @SuppressWarnings("FieldMayBeFinal") public class PreLoadCompatibilityOptions implements ConfigTemplate, Properties { - @Value("fabric.use-vanilla-biomes") + @Value("minecraft.use-vanilla-biomes") @Default private boolean vanillaBiomes = false; - @Value("fabric.beard.enable") + @Value("minecraft.beard.enable") @Default private boolean beard = true; - @Value("fabric.beard.threshold") + @Value("minecraft.beard.threshold") @Default private double beardThreshold = 0.5; - @Value("fabric.beard.air-threshold") + @Value("minecraft.beard.air-threshold") @Default private double airThreshold = -0.5; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoPlatformBiome.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java similarity index 89% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoPlatformBiome.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java index b8262893a..78542fabe 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoPlatformBiome.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/ProtoPlatformBiome.java @@ -15,7 +15,9 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.util; +package com.dfsek.terra.mod.config; + +import com.dfsek.terra.mod.util.MinecraftUtil; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; @@ -37,7 +39,7 @@ public class ProtoPlatformBiome implements PlatformBiome { } public RegistryKey get(Registry registry) { - return FabricUtil.getEntry(registry, identifier).orElseThrow().getKey().orElseThrow(); + return MinecraftUtil.getEntry(registry, identifier).orElseThrow().getKey().orElseThrow(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/VanillaBiomeProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/VanillaBiomeProperties.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java index 889c9148f..b37266230 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/config/VanillaBiomeProperties.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.config; +package com.dfsek.terra.mod.config; import com.dfsek.tectonic.api.config.template.ConfigTemplate; import com.dfsek.tectonic.api.config.template.annotations.Default; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/data/Codecs.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java similarity index 79% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/data/Codecs.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java index a2d2222c7..643ced594 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/data/Codecs.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java @@ -1,10 +1,7 @@ -package com.dfsek.terra.fabric.data; +package com.dfsek.terra.mod.data; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.generation.TerraBiomeSource; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -12,6 +9,10 @@ import net.minecraft.util.dynamic.RegistryOps; import net.minecraft.util.registry.Registry; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.registry.key.RegistryKey; +import com.dfsek.terra.mod.CommonPlatform; + public final class Codecs { public static final Codec TERRA_REGISTRY_KEY = RecordCodecBuilder @@ -27,10 +28,10 @@ public final class Codecs { .create(config -> config.group(TERRA_REGISTRY_KEY.fieldOf("pack") .stable() .forGetter(ConfigPack::getRegistryKey)) - .apply(config, config.stable(id -> FabricEntryPoint.getPlatform() - .getConfigRegistry() - .get(id) - .orElseThrow(() -> new IllegalArgumentException( + .apply(config, config.stable(id -> CommonPlatform.get() + .getConfigRegistry() + .get(id) + .orElseThrow(() -> new IllegalArgumentException( "No such config pack " + id))))); @@ -44,22 +45,22 @@ public final class Codecs { .forGetter(TerraBiomeSource::getPack)) .apply(instance, instance.stable(TerraBiomeSource::new))); - public static final Codec FABRIC_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder + public static final Codec MINECRAFT_CHUNK_GENERATOR_WRAPPER = RecordCodecBuilder .create( instance -> instance.group( RegistryOps.createRegistryCodec(Registry.STRUCTURE_SET_KEY) .fieldOf("structure_registry") .stable() - .forGetter(FabricChunkGeneratorWrapper::getNoiseRegistry), + .forGetter(MinecraftChunkGeneratorWrapper::getNoiseRegistry), TERRA_BIOME_SOURCE.fieldOf("biome_source") .stable() - .forGetter(FabricChunkGeneratorWrapper::getBiomeSource), + .forGetter(MinecraftChunkGeneratorWrapper::getBiomeSource), CONFIG_PACK.fieldOf("pack") .stable() - .forGetter(FabricChunkGeneratorWrapper::getPack), + .forGetter(MinecraftChunkGeneratorWrapper::getPack), ChunkGeneratorSettings.REGISTRY_CODEC.fieldOf("settings") .stable() - .forGetter(FabricChunkGeneratorWrapper::getSettings) - ).apply(instance, instance.stable(FabricChunkGeneratorWrapper::new)) + .forGetter(MinecraftChunkGeneratorWrapper::getSettings) + ).apply(instance, instance.stable(MinecraftChunkGeneratorWrapper::new)) ); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java similarity index 91% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java index 04e87e4bc..1b8af7852 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java @@ -15,7 +15,9 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.generation; +package com.dfsek.terra.mod.generation; + +import com.dfsek.terra.mod.mixin.access.StructureAccessorAccessor; import com.mojang.serialization.Codec; import net.minecraft.block.BlockState; @@ -61,14 +63,13 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.api.world.chunk.generation.stage.Chunkified; import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; import com.dfsek.terra.api.world.info.WorldProperties; -import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; -import com.dfsek.terra.fabric.data.Codecs; -import com.dfsek.terra.fabric.mixin.access.StructureAccessorAccessor; -import com.dfsek.terra.fabric.util.FabricAdapter; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.mod.data.Codecs; +import com.dfsek.terra.mod.util.MinecraftAdapter; -public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.ChunkGenerator implements GeneratorWrapper { - private static final Logger logger = LoggerFactory.getLogger(FabricChunkGeneratorWrapper.class); +public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.ChunkGenerator implements GeneratorWrapper { + private static final Logger logger = LoggerFactory.getLogger(MinecraftChunkGeneratorWrapper.class); private final TerraBiomeSource biomeSource; private final Registry noiseRegistry; @@ -76,8 +77,8 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C private ChunkGenerator delegate; private ConfigPack pack; - public FabricChunkGeneratorWrapper(Registry noiseRegistry, TerraBiomeSource biomeSource, ConfigPack configPack, - RegistryEntry settingsSupplier) { + public MinecraftChunkGeneratorWrapper(Registry noiseRegistry, TerraBiomeSource biomeSource, ConfigPack configPack, + RegistryEntry settingsSupplier) { super(noiseRegistry, Optional.empty(), biomeSource); this.noiseRegistry = noiseRegistry; this.pack = configPack; @@ -94,7 +95,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override protected Codec getCodec() { - return Codecs.FABRIC_CHUNK_GENERATOR_WRAPPER; + return Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER; } @Override @@ -185,7 +186,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override public int getHeight(int x, int z, Type heightmap, HeightLimitView height, NoiseConfig noiseConfig) { - WorldProperties properties = FabricAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); BiomeProvider biomeProvider = pack.getBiomeProvider(); int min = height.getBottomY(); for(int y = height.getTopY() - 1; y >= min; y--) { @@ -199,7 +200,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height, NoiseConfig noiseConfig) { BlockState[] array = new BlockState[height.getHeight()]; - WorldProperties properties = FabricAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); + WorldProperties properties = MinecraftAdapter.adapt(height, noiseConfig.getLegacyWorldSeed()); BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java similarity index 90% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java index 17aaa343f..7f1f1d6dd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/TerraBiomeSource.java @@ -15,18 +15,16 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.generation; +package com.dfsek.terra.mod.generation; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.fabric.data.Codecs; -import com.dfsek.terra.fabric.util.ProtoPlatformBiome; +import com.dfsek.terra.mod.data.Codecs; +import com.dfsek.terra.mod.config.ProtoPlatformBiome; -import com.dfsek.terra.fabric.util.SeedHack; +import com.dfsek.terra.mod.util.SeedHack; import com.mojang.serialization.Codec; -import it.unimi.dsi.fastutil.objects.Object2LongMap; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.biome.source.BiomeSource; @@ -34,7 +32,6 @@ import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Map; import java.util.stream.StreamSupport; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java similarity index 87% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java index beb2ee7a2..5d26b6c43 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java @@ -15,9 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.handle; - -import com.dfsek.terra.fabric.FabricEntryPoint; +package com.dfsek.terra.mod.handle; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -32,14 +30,16 @@ import java.util.stream.Collectors; import com.dfsek.terra.api.handle.ItemHandle; import com.dfsek.terra.api.inventory.Item; import com.dfsek.terra.api.inventory.item.Enchantment; +import com.dfsek.terra.mod.CommonPlatform; -public class FabricItemHandle implements ItemHandle { +public class MinecraftItemHandle implements ItemHandle { @Override public Item createItem(String data) { try { - return (Item) new ItemStackArgumentType(new CommandRegistryAccess(FabricEntryPoint.getPlatform().getServer().getRegistryManager())).parse(new StringReader(data)).getItem(); + return (Item) new ItemStackArgumentType(new CommandRegistryAccess( + CommonPlatform.get().getServer().getRegistryManager())).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java similarity index 89% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java index ac7a0e248..13eef4b2d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java @@ -15,16 +15,12 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.handle; +package com.dfsek.terra.mod.handle; -import com.dfsek.terra.fabric.FabricEntryPoint; - -import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import org.jetbrains.annotations.NotNull; @@ -33,7 +29,7 @@ import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.handle.WorldHandle; -public class FabricWorldHandle implements WorldHandle { +public class MinecraftWorldHandle implements WorldHandle { private static final BlockState AIR = (BlockState) Blocks.AIR.getDefaultState(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java index 28cda62be..5289cd427 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/MobSpawnerLogicAccessor.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.access; +package com.dfsek.terra.mod.mixin.access; import net.minecraft.world.MobSpawnerEntry; import net.minecraft.world.MobSpawnerLogic; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StateAccessor.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StateAccessor.java index 1ec51c2dc..0cee6cbaf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StateAccessor.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.access; +package com.dfsek.terra.mod.mixin.access; import net.minecraft.state.State; import net.minecraft.state.property.Property; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StructureAccessorAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StructureAccessorAccessor.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StructureAccessorAccessor.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StructureAccessorAccessor.java index da33618d2..b64b47faa 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StructureAccessorAccessor.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/StructureAccessorAccessor.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.access; +package com.dfsek.terra.mod.mixin.access; import net.minecraft.world.WorldAccess; import net.minecraft.world.gen.StructureAccessor; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java similarity index 79% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java index ced25c46b..ba73ff960 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/BeeMoveGoalsUnsynchronizedRandomAccessFix.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.fix; +package com.dfsek.terra.mod.mixin.fix; import net.minecraft.entity.passive.BeeEntity.MoveToFlowerGoal; import net.minecraft.entity.passive.BeeEntity.MoveToHiveGoal; @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import com.dfsek.terra.fabric.FabricEntryPoint; +import com.dfsek.terra.mod.CommonPlatform; /** @@ -22,6 +22,6 @@ import com.dfsek.terra.fabric.FabricEntryPoint; public class BeeMoveGoalsUnsynchronizedRandomAccessFix { @Redirect(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;random:Lnet/minecraft/util/math/random/Random;")) public Random redirectRandomAccess(World instance) { - return new CheckedRandom(FabricEntryPoint.getPlatform().getServer().getTicks()); // replace with new random seeded by tick time. + return new CheckedRandom(CommonPlatform.get().getServer().getTicks()); // replace with new random seeded by tick time. } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/NetherFossilOptimization.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java similarity index 57% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/NetherFossilOptimization.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java index 770b042dd..f0eb245b8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/fix/NetherFossilOptimization.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/fix/NetherFossilOptimization.java @@ -1,24 +1,11 @@ -package com.dfsek.terra.fabric.mixin.fix; +package com.dfsek.terra.mod.mixin.fix; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.structure.NetherFossilGenerator; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.random.ChunkRandom; -import net.minecraft.world.EmptyBlockView; -import net.minecraft.world.gen.HeightContext; -import net.minecraft.world.gen.chunk.VerticalBlockSample; -import net.minecraft.world.gen.heightprovider.HeightProvider; import net.minecraft.world.gen.structure.NetherFossilStructure; -import net.minecraft.world.gen.structure.Structure; import net.minecraft.world.gen.structure.Structure.Context; import net.minecraft.world.gen.structure.Structure.StructurePosition; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -35,7 +22,7 @@ import java.util.Optional; public class NetherFossilOptimization { @Inject(method = "getStructurePosition", at = @At("HEAD"), cancellable = true) public void injectFossilPositions(Context context, CallbackInfoReturnable> cir) { - if(context.chunkGenerator() instanceof FabricChunkGeneratorWrapper) { + if(context.chunkGenerator() instanceof MinecraftChunkGeneratorWrapper) { cir.setReturnValue(Optional.empty()); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java similarity index 89% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java index 39236239f..df71e733f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/compat/GenerationSettingsFloraFeaturesMixin.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.fabric.mixin.implementations.compat; +package com.dfsek.terra.mod.mixin.implementations.compat; -import com.dfsek.terra.fabric.mixin_ifaces.FloraFeatureHolder; +import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.feature.ConfiguredFeature; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/BiomeMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/BiomeMixin.java similarity index 94% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/BiomeMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/BiomeMixin.java index 7ad40e91f..893921e8e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/BiomeMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/BiomeMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra; +package com.dfsek.terra.mod.mixin.implementations.terra; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/HandleImplementationMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/HandleImplementationMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/HandleImplementationMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/HandleImplementationMixin.java index 09ddf21a7..0257421ca 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/HandleImplementationMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/HandleImplementationMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.implementations.terra; +package com.dfsek.terra.mod.mixin.implementations.terra; import net.minecraft.block.Block; import net.minecraft.block.BlockState; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/BlockMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/BlockMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java index 271615c01..480e4a86d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/BlockMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.block; +package com.dfsek.terra.mod.mixin.implementations.terra.block; import net.minecraft.block.Block; import net.minecraft.block.Blocks; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/BlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/BlockEntityMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/BlockEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/BlockEntityMixin.java index a8fc2a580..cfb7b795b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/BlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/BlockEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.block.entity; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java similarity index 94% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java index 40755991e..ad237b3b8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/LootableContainerBlockEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.block.entity; import net.minecraft.block.entity.LootableContainerBlockEntity; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java similarity index 92% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java index 07fdd9630..f28c27a62 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.block.entity; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; @@ -34,8 +34,8 @@ import org.spongepowered.asm.mixin.Shadow; import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.SerialState; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.mixin.access.MobSpawnerLogicAccessor; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.mixin.access.MobSpawnerLogicAccessor; @Mixin(MobSpawnerBlockEntity.class) @@ -116,7 +116,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { public void terra$applyState(String state) { SerialState.parse(state).forEach((k, v) -> { switch(k) { - case "type" -> terra$setSpawnedType(FabricEntryPoint.getPlatform().getWorldHandle().getEntity(v)); + case "type" -> terra$setSpawnedType(CommonPlatform.get().getWorldHandle().getEntity(v)); case "delay" -> terra$setDelay(Integer.parseInt(v)); case "min_delay" -> terra$setMinSpawnDelay(Integer.parseInt(v)); case "max_delay" -> terra$setMaxSpawnDelay(Integer.parseInt(v)); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java index 2006246d8..e32d7e053 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/SignBlockEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.block.entity; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.text.Text; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/BlockStateMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/BlockStateMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java index 361dd8ae4..86272efd9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/BlockStateMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateMixin.java @@ -1,6 +1,8 @@ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.state; +package com.dfsek.terra.mod.mixin.implementations.terra.block.state; +import com.dfsek.terra.mod.mixin.access.StateAccessor; + import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; import net.minecraft.block.AbstractBlock.AbstractBlockState; @@ -18,7 +20,6 @@ import java.util.stream.Collectors; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.Property; -import com.dfsek.terra.fabric.mixin.access.StateAccessor; @Mixin(AbstractBlockState.class) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/PropertyMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java similarity index 93% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/PropertyMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java index 7665662be..2dd6100d6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/block/state/PropertyMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.implementations.terra.block.state; +package com.dfsek.terra.mod.mixin.implementations.terra.block.state; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/ChunkRegionMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java index 4da5c28cf..7224f25d1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.chunk; +package com.dfsek.terra.mod.mixin.implementations.terra.chunk; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/WorldChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/WorldChunkMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java index 885d0aae2..3fb01104d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/WorldChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.chunk; +package com.dfsek.terra.mod.mixin.implementations.terra.chunk; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.WorldChunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java index afae72689..f90e5a3b3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.chunk.data; +package com.dfsek.terra.mod.mixin.implementations.terra.chunk.data; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java similarity index 90% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java index beeaf0d57..dce95cf19 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.entity; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; @@ -26,7 +26,7 @@ import org.spongepowered.asm.mixin.Shadow; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; -import com.dfsek.terra.fabric.util.FabricAdapter; +import com.dfsek.terra.mod.util.MinecraftAdapter; @Mixin(Entity.class) @@ -42,7 +42,7 @@ public abstract class EntityMixin { public abstract void teleport(double destX, double destY, double destZ); public Vector3 terra$position() { - return FabricAdapter.adapt(blockPos); + return MinecraftAdapter.adapt(blockPos); } public void terra$position(Vector3 location) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityTypeMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityTypeMixin.java similarity index 93% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityTypeMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityTypeMixin.java index 27ea5a462..a79d4fb0d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/EntityTypeMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/EntityTypeMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.entity; import net.minecraft.entity.EntityType; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/PlayerEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/PlayerEntityMixin.java similarity index 94% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/PlayerEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/PlayerEntityMixin.java index 8298cb4e7..ec60c9f69 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/PlayerEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/PlayerEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.entity; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/ServerCommandSourceMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/ServerCommandSourceMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java index a8fdb8958..f11ee5f73 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/entity/ServerCommandSourceMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/entity/ServerCommandSourceMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.entity; +package com.dfsek.terra.mod.mixin.implementations.terra.entity; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.server.command.ServerCommandSource; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java index e888e511a..90c0275dc 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/LockableContainerBlockEntityMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory; import net.minecraft.block.entity.LockableContainerBlockEntity; import net.minecraft.item.Items; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java index 111aa95fa..51687c45a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory.item; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; import net.minecraft.item.Item; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemStackMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 3dafd81be..f41bce58d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory.item; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java index ddc2e6936..d5394870c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/EnchantmentMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory.meta; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.enchantment.Enchantment; import net.minecraft.util.registry.Registry; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java index 4749b8b4d..599dd232d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackDamageableMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory.meta; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java index 0fe8f7686..39974ed26 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/meta/ItemStackMetaMixin.java @@ -15,7 +15,7 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.inventory.meta; +package com.dfsek.terra.mod.mixin.implementations.terra.inventory.meta; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/package-info.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/package-info.java similarity index 92% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/package-info.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/package-info.java index 64552f11a..0d7e843de 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/package-info.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/package-info.java @@ -20,4 +20,4 @@ * interfaces in Minecraft classes. */ -package com.dfsek.terra.fabric.mixin.implementations.terra; \ No newline at end of file +package com.dfsek.terra.mod.mixin.implementations.terra; \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java similarity index 93% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ChunkRegionMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 7a5ebf822..c17a8c1ee 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -15,8 +15,9 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.world; +package com.dfsek.terra.mod.mixin.implementations.terra.world; +import com.dfsek.terra.mod.util.MinecraftUtil; import net.minecraft.block.FluidBlock; import net.minecraft.fluid.Fluid; import net.minecraft.util.math.BlockPos; @@ -47,8 +48,7 @@ import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.util.FabricUtil; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; @Mixin(ChunkRegion.class) @@ -109,7 +109,7 @@ public abstract class ChunkRegionMixin { } public BlockEntity terraWorld$getBlockEntity(int x, int y, int z) { - return FabricUtil.createState((WorldAccess) this, new BlockPos(x, y, z)); + return MinecraftUtil.createState((WorldAccess) this, new BlockPos(x, y, z)); } public int terraWorld$getMinHeight() { @@ -117,7 +117,7 @@ public abstract class ChunkRegionMixin { } public ChunkGenerator terraWorld$getGenerator() { - return ((FabricChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator()).getHandle(); + return ((MinecraftChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator()).getHandle(); } public BiomeProvider terraWorld$getBiomeProvider() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java similarity index 85% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ServerWorldMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java index 048b38d8e..f219db0a1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/terra/world/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java @@ -15,8 +15,9 @@ * along with Terra. If not, see . */ -package com.dfsek.terra.fabric.mixin.implementations.terra.world; +package com.dfsek.terra.mod.mixin.implementations.terra.world; +import com.dfsek.terra.mod.util.MinecraftUtil; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; import org.spongepowered.asm.mixin.Implements; @@ -33,9 +34,8 @@ import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.Chunk; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; -import com.dfsek.terra.fabric.util.FabricUtil; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.generation.TerraBiomeSource; @Mixin(net.minecraft.server.world.ServerWorld.class) @@ -73,7 +73,7 @@ public abstract class ServerWorldMixin { } public BlockEntity terra$getBlockEntity(int x, int y, int z) { - return FabricUtil.createState((WorldAccess) this, new BlockPos(x, y, z)); + return MinecraftUtil.createState((WorldAccess) this, new BlockPos(x, y, z)); } public int terra$getMinHeight() { @@ -81,8 +81,8 @@ public abstract class ServerWorldMixin { } public ChunkGenerator terra$getGenerator() { - return ((FabricChunkGeneratorWrapper) ((net.minecraft.server.world.ServerWorld) (Object) this).getChunkManager() - .getChunkGenerator()).getHandle(); + return ((MinecraftChunkGeneratorWrapper) ((net.minecraft.server.world.ServerWorld) (Object) this).getChunkManager() + .getChunkGenerator()).getHandle(); } public BiomeProvider terra$getBiomeProvider() { @@ -94,8 +94,8 @@ public abstract class ServerWorldMixin { public ConfigPack terra$getPack() { net.minecraft.world.gen.chunk.ChunkGenerator generator = (((net.minecraft.server.world.ServerWorld) (Object) this).getChunkManager()).getChunkGenerator(); - if(generator instanceof FabricChunkGeneratorWrapper fabricChunkGeneratorWrapper) { - return fabricChunkGeneratorWrapper.getPack(); + if(generator instanceof MinecraftChunkGeneratorWrapper minecraftChunkGeneratorWrapper) { + return minecraftChunkGeneratorWrapper.getPack(); } return null; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java similarity index 84% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java index f2e38a11d..d18fbf8d2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.fabric.mixin.lifecycle; +package com.dfsek.terra.mod.mixin.lifecycle; + +import com.dfsek.terra.mod.util.TagUtil; +import com.dfsek.terra.mod.util.MinecraftUtil; -import com.dfsek.terra.fabric.util.BiomeUtil; -import com.dfsek.terra.fabric.util.TagUtil; import net.minecraft.server.DataPackContents; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; @@ -23,6 +24,6 @@ public class DataPackContentsMixin { Registry biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY); TagUtil.registerBiomeTags(biomeRegistry); - BiomeUtil.registerFlora(biomeRegistry); + MinecraftUtil.registerFlora(biomeRegistry); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin_ifaces/FloraFeatureHolder.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/FloraFeatureHolder.java similarity index 81% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin_ifaces/FloraFeatureHolder.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/FloraFeatureHolder.java index 5f4697d99..4e7c38dec 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin_ifaces/FloraFeatureHolder.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin_ifaces/FloraFeatureHolder.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin_ifaces; +package com.dfsek.terra.mod.mixin_ifaces; import net.minecraft.world.gen.feature.ConfiguredFeature; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java new file mode 100644 index 000000000..2f43913e2 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java @@ -0,0 +1,56 @@ +/* + * This file is part of Terra. + * + * Terra is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Terra is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Terra. If not, see . + */ + +package com.dfsek.terra.mod.util; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.HeightLimitView; + +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public final class MinecraftAdapter { + + public static Vector3 adapt(BlockPos pos) { + return Vector3.of(pos.getX(), pos.getY(), pos.getZ()); + } + + public static WorldProperties adapt(HeightLimitView height, long seed) { + return new WorldProperties() { + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getTopY(); + } + + @Override + public int getMinHeight() { + return height.getBottomY(); + } + + @Override + public Object getHandle() { + return height; + } + }; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java new file mode 100644 index 000000000..80178c3be --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -0,0 +1,154 @@ +package com.dfsek.terra.mod.util; + +import com.dfsek.terra.api.block.entity.BlockEntity; +import com.dfsek.terra.api.block.entity.Container; +import com.dfsek.terra.api.block.entity.MobSpawner; +import com.dfsek.terra.api.block.entity.Sign; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.mod.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; + +import net.minecraft.block.entity.LootableContainerBlockEntity; +import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.Biome.Builder; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + + +public final class MinecraftUtil { + public static final Logger logger = LoggerFactory.getLogger(MinecraftUtil.class); + public static final Map> + TERRA_BIOME_MAP = new HashMap<>(); + + private MinecraftUtil() { + + } + + public static Optional> getEntry(Registry registry, Identifier identifier) { + return registry.getOrEmpty(identifier) + .flatMap(registry::getKey) + .map(registry::getOrCreateEntry); + } + + public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { + net.minecraft.block.entity.BlockEntity entity = worldAccess.getBlockEntity(pos); + if(entity instanceof SignBlockEntity) { + return (Sign) entity; + } else if(entity instanceof MobSpawnerBlockEntity) { + return (MobSpawner) entity; + } else if(entity instanceof LootableContainerBlockEntity) { + return (Container) entity; + } + return null; + } + + public static void registerFlora(Registry biomes) { + logger.info("Injecting flora into Terra biomes..."); + TERRA_BIOME_MAP + .forEach((vb, terraBiomes) -> + biomes.getOrEmpty(vb) + .ifPresentOrElse(vanilla -> terraBiomes + .forEach(tb -> biomes.getOrEmpty(tb) + .ifPresentOrElse( + terra -> { + List> flowerFeatures = List.copyOf(vanilla.getGenerationSettings().getFlowerFeatures()); + logger.debug("Injecting flora into biome {} : {}", tb, flowerFeatures); + ((FloraFeatureHolder) terra.getGenerationSettings()).setFloraFeatures(flowerFeatures); + }, + () -> logger.error( + "No such biome: {}", + tb))), + () -> logger.error("No vanilla biome: {}", vb))); + + } + + public static Map> getTerraBiomeMap() { + return Map.copyOf(TERRA_BIOME_MAP); + } + + public static RegistryKey registerKey(Identifier identifier) { + return RegistryKey.of(Registry.BIOME_KEY, identifier); + } + + public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) { + GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + + BiomeEffects.Builder effects = new BiomeEffects.Builder(); + + Biome.Builder builder = new Builder(); + + if(biome.getContext().has(VanillaBiomeProperties.class)) { + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); + + effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) + .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) + .fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) + .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())) + .grassColorModifier( + Objects.requireNonNullElse(vanillaBiomeProperties.getModifier(), vanilla.getEffects().getGrassColorModifier())); + + + if(vanillaBiomeProperties.getGrassColor() == null) { + vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor); + } else { + effects.grassColor(vanillaBiomeProperties.getGrassColor()); + } + + if(vanillaBiomeProperties.getFoliageColor() == null) { + vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor); + } else { + effects.foliageColor(vanillaBiomeProperties.getFoliageColor()); + } + + builder.precipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.getPrecipitation())); + + } else { + effects.waterColor(vanilla.getWaterColor()) + .waterFogColor(vanilla.getWaterFogColor()) + .fogColor(vanilla.getFogColor()) + .skyColor(vanilla.getSkyColor()); + vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor); + vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor); + + builder.precipitation(vanilla.getPrecipitation()); + } + + vanilla.getLoopSound().ifPresent(effects::loopSound); + vanilla.getAdditionsSound().ifPresent(effects::additionsSound); + vanilla.getMoodSound().ifPresent(effects::moodSound); + vanilla.getMusic().ifPresent(effects::music); + vanilla.getParticleConfig().ifPresent(effects::particleConfig); + + return builder + .temperature(vanilla.getTemperature()) + .downfall(vanilla.getDownfall()) + .effects(effects.build()) + .spawnSettings(vanilla.getSpawnSettings()) + .generationSettings(generationSettings.build()) + .build(); + } + + public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { + return pack.getID() + .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/LifecycleUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java similarity index 63% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/LifecycleUtil.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java index 2e935d889..7b3e57ca5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/LifecycleUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java @@ -1,9 +1,10 @@ -package com.dfsek.terra.fabric.util; +package com.dfsek.terra.mod.util; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; +import com.dfsek.terra.api.config.ConfigPack; + +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.generation.TerraBiomeSource; import net.minecraft.structure.StructureSet; import net.minecraft.util.Identifier; @@ -30,24 +31,17 @@ import java.util.Locale; import java.util.Map; -public class LifecycleUtil { - private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleUtil.class); - +public class PresetUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); private static final List PRESETS = new ArrayList<>(); - public static void initialize() { - FabricEntryPoint.getPlatform().getEventManager().callEvent( - new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(); - - - LOGGER.info("Registering Terra world types..."); - + + public static Pair createDefault(ConfigPack pack) { Registry dimensionTypeRegistry = BuiltinRegistries.DIMENSION_TYPE; Registry chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS; Registry structureSetRegistry = BuiltinRegistries.STRUCTURE_SET; Registry noiseParametersRegistry = BuiltinRegistries.NOISE_PARAMETERS; Registry biomeRegistry = BuiltinRegistries.BIOME; - + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.THE_NETHER); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.NETHER); @@ -64,34 +58,29 @@ public class LifecycleUtil { new NoiseChunkGenerator(structureSetRegistry, noiseParametersRegistry, new TheEndBiomeSource(biomeRegistry), endChunkGeneratorSettings)); - + RegistryEntry overworldDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.OVERWORLD); - + RegistryEntry overworld = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.OVERWORLD); - FabricEntryPoint - .getPlatform() - .getRawConfigRegistry() - .forEach((id, pack) -> { - Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( - Locale.ROOT)); - - PRESETS.add(generatorID); - - TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); - ChunkGenerator generator = new FabricChunkGeneratorWrapper(structureSetRegistry, biomeSource, pack, overworld); - - DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); - WorldPreset preset = new WorldPreset( - Map.of( - DimensionOptions.OVERWORLD, dimensionOptions, - DimensionOptions.NETHER, netherDimensionOptions, - DimensionOptions.END, endDimensionOptions - ) - ); - BuiltinRegistries.add(BuiltinRegistries.WORLD_PRESET, generatorID, preset); - LOGGER.info("Registered world type \"{}\"", generatorID); - } - ); + + Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( + Locale.ROOT)); + + PRESETS.add(generatorID); + + TerraBiomeSource biomeSource = new TerraBiomeSource(biomeRegistry, pack); + ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(structureSetRegistry, biomeSource, pack, overworld); + + DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); + WorldPreset preset = new WorldPreset( + Map.of( + DimensionOptions.OVERWORLD, dimensionOptions, + DimensionOptions.NETHER, netherDimensionOptions, + DimensionOptions.END, endDimensionOptions + ) + ); + LOGGER.info("Created world type \"{}\"", generatorID); + return Pair.of(generatorID, preset); } public static List getPresets() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/SeedHack.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/SeedHack.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/SeedHack.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/SeedHack.java index f0c59fc00..74f9173ab 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/SeedHack.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/SeedHack.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.util; +package com.dfsek.terra.mod.util; import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java index 7a52ff376..8edf50afc 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.util; +package com.dfsek.terra.mod.util; import com.google.common.collect.ImmutableMap; import net.minecraft.tag.TagKey; @@ -36,9 +36,9 @@ public final class TagUtil { logger.info("Doing preset tag garbage...."); Map, List>> collect = tagsToMutableMap(registry); - LifecycleUtil + PresetUtil .getPresets() - .forEach(id -> FabricUtil + .forEach(id -> MinecraftUtil .getEntry(registry, id) .ifPresentOrElse( preset -> collect @@ -54,14 +54,14 @@ public final class TagUtil { logger.info("Doing biome tag garbage...."); Map, List>> collect = tagsToMutableMap(registry); - BiomeUtil + MinecraftUtil .getTerraBiomeMap() .forEach((vb, terraBiomes) -> - FabricUtil + MinecraftUtil .getEntry(registry, vb) .ifPresentOrElse( vanilla -> terraBiomes - .forEach(tb -> FabricUtil + .forEach(tb -> MinecraftUtil .getEntry(registry, tb) .ifPresentOrElse( terra -> { diff --git a/platforms/mixin-common/src/main/resources/fabric.mod.json b/platforms/mixin-common/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..2f4b9b0de --- /dev/null +++ b/platforms/mixin-common/src/main/resources/fabric.mod.json @@ -0,0 +1,8 @@ +{ + "schemaVersion": 1, + "id": "terra-common", + "version": "1.0.0", + "mixins": [ + "terra.common.mixins.json" + ] +} \ No newline at end of file diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json new file mode 100644 index 000000000..b084bee6f --- /dev/null +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -0,0 +1,47 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.mod.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "access.MobSpawnerLogicAccessor", + "access.StateAccessor", + "access.StructureAccessorAccessor", + "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", + "fix.NetherFossilOptimization", + "implementations.compat.GenerationSettingsFloraFeaturesMixin", + "implementations.terra.BiomeMixin", + "implementations.terra.HandleImplementationMixin", + "implementations.terra.block.BlockMixin", + "implementations.terra.block.entity.BlockEntityMixin", + "implementations.terra.block.entity.LootableContainerBlockEntityMixin", + "implementations.terra.block.entity.MobSpawnerBlockEntityMixin", + "implementations.terra.block.entity.SignBlockEntityMixin", + "implementations.terra.block.state.BlockStateMixin", + "implementations.terra.block.state.PropertyMixin", + "implementations.terra.chunk.ChunkRegionMixin", + "implementations.terra.chunk.WorldChunkMixin", + "implementations.terra.chunk.data.ProtoChunkMixin", + "implementations.terra.entity.EntityMixin", + "implementations.terra.entity.EntityTypeMixin", + "implementations.terra.entity.PlayerEntityMixin", + "implementations.terra.entity.ServerCommandSourceMixin", + "implementations.terra.inventory.LockableContainerBlockEntityMixin", + "implementations.terra.inventory.item.ItemMixin", + "implementations.terra.inventory.item.ItemStackMixin", + "implementations.terra.inventory.meta.EnchantmentMixin", + "implementations.terra.inventory.meta.ItemStackDamageableMixin", + "implementations.terra.inventory.meta.ItemStackMetaMixin", + "implementations.terra.world.ChunkRegionMixin", + "implementations.terra.world.ServerWorldMixin", + "lifecycle.DataPackContentsMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra-common-refmap.json" +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 7a34493bb..a8a8b3644 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,9 +24,15 @@ include(":platforms:bukkit:common") pluginManagement { repositories { - maven("https://maven.fabricmc.net") { - name = "Fabric" - } gradlePluginPortal() + maven("https://maven.fabricmc.net") { + name = "Fabric Maven" + } + maven ( "https://maven.architectury.dev/" ) { + name = "Architectury Maven" + } + maven ( "https://files.minecraftforge.net/maven/" ) { + name = "Forge Maven" + } } }