diff --git a/.gitignore b/.gitignore index 11b505e85..63dda4360 100644 --- a/.gitignore +++ b/.gitignore @@ -247,6 +247,5 @@ nbdist/ **/testDir/ -platforms/fabric/run/** +platforms/**/run/** -platforms/forge/run/** diff --git a/buildSrc/src/main/kotlin/DependencyConfig.kt b/buildSrc/src/main/kotlin/DependencyConfig.kt index 55f6f18b6..d31736022 100644 --- a/buildSrc/src/main/kotlin/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/DependencyConfig.kt @@ -45,6 +45,9 @@ fun Project.configureDependencies() { maven ("https://maven.quiltmc.org/repository/release/") { name = "Quilt" } + maven("https://jitpack.io") { + name = "JitPack" + } } dependencies { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index d5a77a8c4..ef3ce2946 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -18,32 +18,32 @@ object Versions { } object Fabric { - const val fabricLoader = "0.14.2" - const val fabricAPI = "0.56.0+1.19" - const val mixin = "0.11.2+mixin.0.8.5" - const val loom = "0.12-SNAPSHOT" - const val minotaur = "1.1.0" + const val fabricLoader = "0.14.8" + const val fabricAPI = "0.57.0+1.19" } object Quilt { const val quiltLoader = "0.17.0" - const val loom = "0.12.+" - const val fabricApi = "2.0.0-alpha.2+0.55.3-1.19" + const val fabricApi = "2.0.0-beta.4+0.57.0-1.19" } object Mod { + const val mixin = "0.11.2+mixin.0.8.5" + 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" + const val architecturyPlugin = "3.4-SNAPSHOT" const val loomQuiltflower = "1.7.1" + + const val lazyDfu = "0.1.2" } object Forge { - const val forge = "${Mod.minecraft}-41.0.38" + const val forge = "${Mod.minecraft}-41.0.63" const val burningwave = "12.53.0" } @@ -64,5 +64,6 @@ object Versions { const val nbt = "6.1" const val logback = "1.2.9" const val commonsIO = "2.7" + const val guava = "31.0.1-jre" } } \ No newline at end of file diff --git a/common/addons/structure-sponge-loader/build.gradle.kts b/common/addons/structure-sponge-loader/build.gradle.kts index d064e4fd5..dba93405f 100644 --- a/common/addons/structure-sponge-loader/build.gradle.kts +++ b/common/addons/structure-sponge-loader/build.gradle.kts @@ -2,10 +2,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar version = version("1.0.0") -repositories { - maven { url = uri("https://jitpack.io/") } -} - dependencies { api("commons-io:commons-io:2.7") api("com.github.Querz:NBT:6.1") diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java new file mode 100644 index 000000000..e530ec04a --- /dev/null +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/AwfulBukkitHacks.java @@ -0,0 +1,106 @@ +package com.dfsek.terra.bukkit.nms.v1_18_R2; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); + private static final Map> terraBiomeMap = new HashMap<>(); + + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) Registries.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { + try { + BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); + NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); + ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome( + biome, + biomeRegistry.get(vanillaMinecraftKey) // get + ); + + ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key))); + + BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); + biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) + + LOGGER.info("Doing tag garbage...."); + Map, List>> collect = biomeRegistry + .getTags() // streamKeysAndEntries + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb) + .ifPresentOrElse( + vanilla -> terraBiomes + .forEach(tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb) + .ifPresentOrElse( + terra -> { + LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() + + " (vanilla for " + + terra.unwrapKey().orElseThrow().location() + + ": " + + vanilla.tags().toList()); + + vanilla.tags() + .forEach( + tag -> collect + .computeIfAbsent(tag, + t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error( + "No such biome: {}", + tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); // clearTags + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java index 3c69226d8..bf42448b2 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java @@ -31,84 +31,6 @@ import com.dfsek.terra.registry.master.ConfigRegistry; public class NMSBiomeInjector { - private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); - private static final Map> terraBiomeMap = new HashMap<>(); - - - public static void registerBiomes(ConfigRegistry configRegistry) { - try { - LOGGER.info("Hacking biome registry..."); - WritableRegistry biomeRegistry = (WritableRegistry) Registries.biomeRegistry(); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); - - configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { - try { - BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); - NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); - ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - Biome platform = createBiome( - biome, - biomeRegistry.get(vanillaMinecraftKey) // get - ); - - ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", createBiomeID(pack, key))); - - BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); - biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); - platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); - - terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); - - LOGGER.debug("Registered biome: " + delegateKey); - } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - throw new RuntimeException(e); - } - })); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) - - LOGGER.info("Doing tag garbage...."); - Map, List>> collect = biomeRegistry - .getTags() // streamKeysAndEntries - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), - HashMap::putAll); - - terraBiomeMap - .forEach((vb, terraBiomes) -> - getEntry(biomeRegistry, vb) - .ifPresentOrElse( - vanilla -> terraBiomes - .forEach(tb -> getEntry(biomeRegistry, tb) - .ifPresentOrElse( - terra -> { - LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() + - " (vanilla for " + - terra.unwrapKey().orElseThrow().location() + - ": " + - vanilla.tags().toList()); - - vanilla.tags() - .forEach( - tag -> collect - .computeIfAbsent(tag, - t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error( - "No such biome: {}", - tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - - biomeRegistry.resetTags(); // clearTags - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags - - } catch(SecurityException | IllegalArgumentException exception) { - throw new RuntimeException(exception); - } - } public static Optional> getEntry(Registry registry, ResourceLocation identifier) { return registry.getOptional(identifier) @@ -116,7 +38,7 @@ public class NMSBiomeInjector { .map(registry::getOrCreateHolder); } - private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) + public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); // Builder diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java index 60c7e1c1d..f724b89f0 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSInitializer.java @@ -9,7 +9,7 @@ import com.dfsek.terra.bukkit.nms.Initializer; public class NMSInitializer implements Initializer { @Override public void initialize(PlatformImpl platform) { - NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry()); + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); } } diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java new file mode 100644 index 000000000..bfda736e2 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java @@ -0,0 +1,102 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1; + +import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; +import com.dfsek.terra.registry.master.ConfigRegistry; +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +public class AwfulBukkitHacks { + private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); + + private static final Map> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) Registries.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { + try { + BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); + NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); + ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome( + biome, + Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)) // get + ); + + ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key))); + + BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); + biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) + + LOGGER.info("Doing tag garbage...."); + Map, List>> collect = biomeRegistry + .getTags() // streamKeysAndEntries + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb) + .ifPresentOrElse( + vanilla -> terraBiomes + .forEach(tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb) + .ifPresentOrElse( + terra -> { + LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() + + " (vanilla for " + + terra.unwrapKey().orElseThrow().location() + + ": " + + vanilla.tags().toList()); + + vanilla.tags() + .forEach( + tag -> collect + .computeIfAbsent(tag, + t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error( + "No such biome: {}", + tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java index fdf380e97..88f224f4b 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java @@ -31,93 +31,14 @@ import com.dfsek.terra.registry.master.ConfigRegistry; public class NMSBiomeInjector { - private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class); - private static final Map> terraBiomeMap = new HashMap<>(); - - - public static void registerBiomes(ConfigRegistry configRegistry) { - try { - LOGGER.info("Hacking biome registry..."); - WritableRegistry biomeRegistry = (WritableRegistry) Registries.biomeRegistry(); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); - - configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { - try { - BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); - NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); - ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - Biome platform = createBiome( - biome, - Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)) // get - ); - - ResourceKey delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, - new ResourceLocation("terra", createBiomeID(pack, key))); - - BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform); - biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); - platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); - - terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); - - LOGGER.debug("Registered biome: " + delegateKey); - } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - throw new RuntimeException(e); - } - })); - - Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) - - LOGGER.info("Doing tag garbage...."); - Map, List>> collect = biomeRegistry - .getTags() // streamKeysAndEntries - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), - HashMap::putAll); - - terraBiomeMap - .forEach((vb, terraBiomes) -> - getEntry(biomeRegistry, vb) - .ifPresentOrElse( - vanilla -> terraBiomes - .forEach(tb -> getEntry(biomeRegistry, tb) - .ifPresentOrElse( - terra -> { - LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() + - " (vanilla for " + - terra.unwrapKey().orElseThrow().location() + - ": " + - vanilla.tags().toList()); - - vanilla.tags() - .forEach( - tag -> collect - .computeIfAbsent(tag, - t -> new ArrayList<>()) - .add(terra)); - }, - () -> LOGGER.error( - "No such biome: {}", - tb))), - () -> LOGGER.error("No vanilla biome: {}", vb))); - - biomeRegistry.resetTags(); - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); - - } catch(SecurityException | IllegalArgumentException exception) { - throw new RuntimeException(exception); - } - } - + public static Optional> getEntry(Registry registry, ResourceLocation identifier) { return registry.getOptional(identifier) .flatMap(registry::getResourceKey) .map(registry::getOrCreateHolderOrThrow); } - private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) + public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java index 61efc587d..82a293cd1 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java @@ -9,7 +9,7 @@ import com.dfsek.terra.bukkit.nms.Initializer; public class NMSInitializer implements Initializer { @Override public void initialize(PlatformImpl platform) { - NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry()); + AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); } } diff --git a/platforms/cli/build.gradle.kts b/platforms/cli/build.gradle.kts index 26d9f3d6c..e273422af 100644 --- a/platforms/cli/build.gradle.kts +++ b/platforms/cli/build.gradle.kts @@ -2,18 +2,15 @@ plugins { application } -repositories { - maven { url = uri("https://jitpack.io/") } -} - val javaMainClass = "com.dfsek.terra.cli.TerraCLI" dependencies { - shadedApi("commons-io:commons-io:${Versions.CLI.commonsIO}") - shadedApi("com.github.Querz:NBT:${Versions.CLI.nbt}") shadedApi(project(":common:implementation:base")) - shadedImplementation("com.google.guava:guava:31.0.1-jre") + shadedApi("commons-io:commons-io:${Versions.CLI.commonsIO}") + shadedApi("com.github.Querz:NBT:${Versions.CLI.nbt}") + + shadedImplementation("com.google.guava:guava:${Versions.CLI.guava}") shadedImplementation("ch.qos.logback:logback-classic:${Versions.CLI.logback}") diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index d73796332..85a829444 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -1,26 +1,22 @@ plugins { - id("fabric-loom") version Versions.Fabric.loom - id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("dev.architectury.loom") version Versions.Mod.architecuryLoom + id("architectury-plugin") version Versions.Mod.architecturyPlugin id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower } - -configurations { - val common by creating - compileClasspath.get().extendsFrom(common) - runtimeClasspath.get().extendsFrom(common) +architectury { + platformSetupLoomIde() + loader("fabric") } dependencies { shadedApi(project(":common:implementation:base")) - compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") - 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 } + implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + "developmentFabric"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionFabric")) { isTransitive = false } - "common"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } + implementation(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } + "developmentFabric"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionFabric")) { isTransitive = false } @@ -37,15 +33,25 @@ dependencies { modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) + + modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}") } loom { - accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener")) + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra.fabric.refmap.json") } + launches { + named("client") { + property("fabric.log.level", "debug") + } + named("server") { + property("fabric.log.level", "debug") + } + } } @@ -57,11 +63,8 @@ tasks { } remapJar { + injectAccessWidener.set(true) inputFile.set(shadowJar.get().archiveFile) archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar") } - - processResources { - from(project(":platforms:mixin-common").file("terra.accesswidener")) - } } diff --git a/platforms/fabric/gradle.properties b/platforms/fabric/gradle.properties new file mode 100644 index 000000000..90ee7a259 --- /dev/null +++ b/platforms/fabric/gradle.properties @@ -0,0 +1 @@ +loom.platform=fabric \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 65289db22..e71bcfeac 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -29,6 +29,5 @@ "fabricloader": ">=0.14.2", "java": ">=17", "minecraft": "1.19.x" - }, - "accessWidener": "terra.accesswidener" + } } \ No newline at end of file diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index fc967677e..6b545f2ba 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -1,31 +1,21 @@ plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom - id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("architectury-plugin") version Versions.Mod.architecturyPlugin id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower } architectury { platformSetupLoomIde() - forge() -} - -configurations { - val common by creating - compileClasspath.get().extendsFrom(common) - runtimeClasspath.get().extendsFrom(common) + loader("forge") } dependencies { shadedApi(project(":common:implementation:base")) "forgeRuntimeLibrary"(project(":common:implementation:base")) - - "common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + "developmentForge"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionForge")) { isTransitive = false } - "developmentForge"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { - isTransitive = false - } - forge(group = "net.minecraftforge", name = "forge", version = Versions.Forge.forge) @@ -38,12 +28,21 @@ dependencies { } loom { - accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener")) + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra.forge.refmap.json") } + launches { + named("client") { + property("fabric.log.level", "debug") + } + named("server") { + property("fabric.log.level", "debug") + } + } + forge { convertAccessWideners.set(true) mixinConfig("terra.common.mixins.json") @@ -66,17 +65,9 @@ tasks { ) } } - - shadowJar { - exclude("fabric.mod.json") - } remapJar { inputFile.set(shadowJar.get().archiveFile) archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar") } - - processResources { - from(project(":platforms:mixin-common").file("terra.accesswidener")) - } } \ 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 index 28fe88ec2..1678fd4a8 100644 --- 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 @@ -1,14 +1,21 @@ package com.dfsek.terra.forge.util; +import com.dfsek.terra.mod.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; + 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.village.VillagerType; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent.RegisterHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Map; +import java.util.Objects; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.Biome; @@ -45,13 +52,15 @@ public final class BiomeUtil { */ 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); + 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()); + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); + + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla).value(), vanillaBiomeProperties); Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); @@ -62,6 +71,10 @@ public final class BiomeUtil { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier).orElseThrow().getKey().orElseThrow()); } + Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + + villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); } } diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts index 47b720ca2..c270dbf53 100644 --- a/platforms/mixin-common/build.gradle.kts +++ b/platforms/mixin-common/build.gradle.kts @@ -1,11 +1,11 @@ plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom - id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("architectury-plugin") version Versions.Mod.architecturyPlugin id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower } loom { - accessWidenerPath.set(file("terra.accesswidener")) + accessWidenerPath.set(file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra.common.refmap.json") @@ -15,7 +15,8 @@ loom { dependencies { shadedApi(project(":common:implementation:base")) - modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") + compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}") + annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}") minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") 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 index 680fcf187..e6a7d9054 100644 --- 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 @@ -12,6 +12,8 @@ import com.dfsek.terra.mod.handle.MinecraftItemHandle; import com.dfsek.terra.mod.handle.MinecraftWorldHandle; +import com.dfsek.terra.mod.config.VillagerTypeTemplate; + import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.server.MinecraftServer; @@ -21,6 +23,7 @@ import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; @@ -89,7 +92,8 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) .registerLoader(SpawnGroup.class, SpawnGroupTemplate::new) .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) - .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new); + .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new) + .registerLoader(VillagerType.class, VillagerTypeTemplate::new); } private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java index e44e4b977..429829267 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java @@ -7,6 +7,7 @@ import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; +import net.minecraft.village.VillagerType; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; @@ -85,6 +86,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Default private SpawnSettings spawnSettings = null; + @Value("villager-type") + @Default + private VillagerType villagerType = null; + public Integer getGrassColor() { return grassColor; } @@ -152,4 +157,8 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { public SpawnSettings getSpawnSettings() { return spawnSettings; } + + public VillagerType getVillagerType() { + return villagerType; + } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java new file mode 100644 index 000000000..235102dac --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.mod.config; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.minecraft.entity.EntityType; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.village.VillagerType; + + +public class VillagerTypeTemplate implements ObjectTemplate { + @Value("id") + @Default + private Identifier id = null; + + @Override + public VillagerType get() { + return Registry.VILLAGER_TYPE.get(id); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java new file mode 100644 index 000000000..acf269a11 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/VillagerTypeAccessor.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.mod.mixin.access; + +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.village.VillagerType; +import net.minecraft.world.biome.Biome; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(VillagerType.class) +public interface VillagerTypeAccessor { + @Accessor("BIOME_TO_TYPE") + static Map, VillagerType> getBiomeTypeToIdMap() { + throw new AssertionError("Untransformed Accessor!"); + } +} 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 index 1fa62bcae..152e743da 100644 --- 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 @@ -1,5 +1,7 @@ package com.dfsek.terra.mod.util; +import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; + import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.SignBlockEntity; @@ -8,6 +10,7 @@ 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.village.VillagerType; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Builder; @@ -89,15 +92,13 @@ public final class MinecraftUtil { return RegistryKey.of(Registry.BIOME_KEY, identifier); } - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) { + public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla, VanillaBiomeProperties vanillaBiomeProperties) { GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); BiomeEffects.Builder effects = new BiomeEffects.Builder(); net.minecraft.world.biome.Biome.Builder builder = new Builder(); - 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())) diff --git a/platforms/mixin-common/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener similarity index 100% rename from platforms/mixin-common/terra.accesswidener rename to platforms/mixin-common/src/main/resources/terra.accesswidener diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json index b2b28d2e0..a6b6987a3 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -8,6 +8,7 @@ "access.MobSpawnerLogicAccessor", "access.StateAccessor", "access.StructureAccessorAccessor", + "access.VillagerTypeAccessor", "fix.BeeMoveGoalsUnsynchronizedRandomAccessFix", "fix.NetherFossilOptimization", "implementations.compat.GenerationSettingsFloraFeaturesMixin", diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index ded26a47c..eb8459b4e 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -1,31 +1,40 @@ plugins { id("dev.architectury.loom") version Versions.Mod.architecuryLoom - id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("architectury-plugin") version Versions.Mod.architecturyPlugin id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower } +dependencies { + shadedApi(project(":common:implementation:base")) + + compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}") + annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}") + + implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + + minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") + mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") +} + loom { - accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener")) + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra.lifecycle.refmap.json") } } -dependencies { - shadedApi(project(":common:implementation:base")) +tasks { + compileJava { + options.release.set(17) + } - modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") - compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}") - - compileOnly(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } - - minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") - mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") + remapJar { + inputFile.set(shadowJar.get().archiveFile) + } } architectury { common("fabric", "quilt") minecraft = Versions.Mod.minecraft -} - +} \ No newline at end of file diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java index b632220f9..8e6732a58 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java @@ -1,13 +1,20 @@ package com.dfsek.terra.lifecycle.util; +import com.dfsek.terra.mod.config.VanillaBiomeProperties; + +import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor; + 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.village.VillagerType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Map; +import java.util.Objects; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.Biome; @@ -49,7 +56,9 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla); } else { - net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla)); + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); + + net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla), vanillaBiomeProperties); Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id)); @@ -63,7 +72,11 @@ public final class BiomeUtil { MinecraftUtil.registerKey(identifier).getValue(), minecraftBiome).getKey().orElseThrow()); } - + + Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap(); + + villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS))); + MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier); } } diff --git a/platforms/quilt/build.gradle.kts b/platforms/quilt/build.gradle.kts index 365fec3bd..ead32bd01 100644 --- a/platforms/quilt/build.gradle.kts +++ b/platforms/quilt/build.gradle.kts @@ -1,53 +1,61 @@ plugins { - id("org.quiltmc.loom") version Versions.Quilt.loom - id("architectury-plugin") version Versions.Mod.architectutyPlugin + id("dev.architectury.loom") version Versions.Mod.architecuryLoom + id("architectury-plugin") version Versions.Mod.architecturyPlugin + id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower } - -configurations { - val common by creating - compileClasspath.get().extendsFrom(common) - runtimeClasspath.get().extendsFrom(common) +architectury { + platformSetupLoomIde() + loader("quilt") } dependencies { shadedApi(project(":common:implementation:base")) - "common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } + "developmentQuilt"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionQuilt")) { isTransitive = false } - "common"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } + implementation(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } + "developmentQuilt"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false } shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionQuilt")) { isTransitive = false } - minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") modImplementation("org.quiltmc:quilt-loader:${Versions.Quilt.quiltLoader}") - modApi("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${Versions.Quilt.fabricApi}") - - setOf( - "fabric-lifecycle-events-v1", - "fabric-resource-loader-v0", - "fabric-api-base", - "fabric-command-api-v2", - "fabric-networking-api-v1" - ).forEach { apiModule -> - val module = fabricApi.module(apiModule, Versions.Fabric.fabricAPI) - modImplementation(module) - include(module) + modImplementation("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${Versions.Quilt.fabricApi}") + + modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) { + exclude("net.fabricmc") + exclude("net.fabricmc.fabric-api") + } + include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) { + exclude("net.fabricmc") + exclude("net.fabricmc.fabric-api") } - modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) - include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) + modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}") { + exclude("net.fabricmc") + exclude("net.fabricmc.fabric-api") + } } loom { - accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener")) + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra.quilt.refmap.json") } + + launches { + named("client") { + property("fabric.log.level", "debug") + } + named("server") { + property("fabric.log.level", "debug") + } + } } @@ -59,11 +67,8 @@ tasks { } remapJar { + injectAccessWidener.set(true) inputFile.set(shadowJar.get().archiveFile) archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar") } - - processResources { - from(project(":platforms:mixin-common").file("terra.accesswidener")) - } } diff --git a/platforms/quilt/gradle.properties b/platforms/quilt/gradle.properties new file mode 100644 index 000000000..96758ce85 --- /dev/null +++ b/platforms/quilt/gradle.properties @@ -0,0 +1 @@ +loom.platform=quilt \ No newline at end of file diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/AwfulQuiltHacks.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/AwfulQuiltHacks.java new file mode 100644 index 000000000..7e3b7afcc --- /dev/null +++ b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/AwfulQuiltHacks.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.quilt; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; + +/** + * So you want to Mixin into Authlib/Brigadier/DataFixerUpper, on Fabric you'll need this guy. + * + *

YOU SHOULD ONLY USE THIS CLASS DURING "preLaunch" and ONLY TARGET A CLASS WHICH IS NOT ANY CLASS YOU MIXIN TO. + * + * This will likely not work on Gson because FabricLoader has some special logic related to Gson. + */ +public final class AwfulQuiltHacks { + private AwfulQuiltHacks() {} + + private static final ClassLoader KNOT_CLASSLOADER = Thread.currentThread().getContextClassLoader(); + private static final Method ADD_URL_METHOD; + + static { + Method tempAddUrlMethod = null; + try { + tempAddUrlMethod = KNOT_CLASSLOADER.getClass().getMethod("addURL", URL.class); + tempAddUrlMethod.setAccessible(true); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to load Classloader fields", e); + } + + ADD_URL_METHOD = tempAddUrlMethod; + } + + /** + * Hackily load the package which a mixin may exist within. + * + * YOU SHOULD NOT TARGET A CLASS WHICH YOU MIXIN TO. + * + * @param pathOfAClass The path of any class within the package. + */ + public static void hackilyLoadForMixin(String pathOfAClass) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException { + URL url = Class.forName(pathOfAClass).getProtectionDomain().getCodeSource().getLocation(); + ADD_URL_METHOD.invoke(KNOT_CLASSLOADER, url); + } +} diff --git a/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPreLaunchEntryPoint.java b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPreLaunchEntryPoint.java new file mode 100644 index 000000000..1e4fb70a9 --- /dev/null +++ b/platforms/quilt/src/main/java/com/dfsek/terra/quilt/QuiltPreLaunchEntryPoint.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.quilt; + +import cloud.commandframework.brigadier.BrigadierMappingBuilder; +import org.quiltmc.loader.api.ModContainer; +import org.quiltmc.loader.api.QuiltLoader; +import org.quiltmc.loader.api.entrypoint.PreLaunchEntrypoint; + +import java.lang.reflect.InvocationTargetException; + + +public class QuiltPreLaunchEntryPoint implements PreLaunchEntrypoint { + @Override + public void onPreLaunch(ModContainer mod) { + if (QuiltLoader.isDevelopmentEnvironment()) { + try { + AwfulQuiltHacks.hackilyLoadForMixin(BrigadierMappingBuilder.class.getName()); + } catch(ClassNotFoundException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/platforms/quilt/src/main/resources/quilt.mod.json b/platforms/quilt/src/main/resources/quilt.mod.json index fdb6735b4..0f53988ec 100644 --- a/platforms/quilt/src/main/resources/quilt.mod.json +++ b/platforms/quilt/src/main/resources/quilt.mod.json @@ -23,6 +23,9 @@ "entrypoints": { "init": [ "com.dfsek.terra.quilt.QuiltEntryPoint" + ], + "pre_launch": [ + "com.dfsek.terra.quilt.QuiltPreLaunchEntryPoint" ] }, "depends": [ @@ -48,6 +51,5 @@ "terra.quilt.mixins.json", "terra.lifecycle.mixins.json", "terra.common.mixins.json" - ], - "accessWidener": "terra.accesswidener" + ] } \ No newline at end of file