diff --git a/src/main/java/org/betterx/bclib/commands/DumpDatapack.java b/src/main/java/org/betterx/bclib/commands/DumpDatapack.java index 760570b3..348c842c 100644 --- a/src/main/java/org/betterx/bclib/commands/DumpDatapack.java +++ b/src/main/java/org/betterx/bclib/commands/DumpDatapack.java @@ -54,6 +54,21 @@ public class DumpDatapack { ) { File base = new File(System.getProperty("user.dir"), "bclib_datapack_dump"); BCLib.LOGGER.info(registry.key().toString()); + // Tag Output +// registry.value() +// .getTagNames() +// .map(tagKey -> registry.value().getTag(tagKey)) +// .filter(tag -> tag.isPresent()) +// .map(tag -> tag.get()) +// .forEach(tag -> { +// tag.stream() +// .map(holder -> holder.unwrapKey()) +// .filter(k -> k.isPresent()) +// .map(k -> k.get()) +// .forEach(key -> { +// +// }); +// }); registry .value() diff --git a/src/main/java/org/betterx/worlds/together/WorldsTogether.java b/src/main/java/org/betterx/worlds/together/WorldsTogether.java index 15967983..28f4a65f 100644 --- a/src/main/java/org/betterx/worlds/together/WorldsTogether.java +++ b/src/main/java/org/betterx/worlds/together/WorldsTogether.java @@ -1,6 +1,7 @@ package org.betterx.worlds.together; import org.betterx.bclib.util.Logger; +import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.world.WorldConfig; import org.betterx.worlds.together.worldPreset.WorldPresets; @@ -23,6 +24,7 @@ public class WorldsTogether { public static void onInitialize() { TagManager.ensureStaticallyLoaded(); + SurfaceRuleRegistry.ensureStaticallyLoaded(); WorldConfig.registerModCache(WorldsTogether.MOD_ID); diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/BuiltinRegistriesMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/BuiltinRegistriesMixin.java new file mode 100644 index 00000000..0d5f1c1d --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/mixin/common/BuiltinRegistriesMixin.java @@ -0,0 +1,33 @@ +package org.betterx.worlds.together.mixin.common; + +import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; + +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.SurfaceRules; + +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.CallbackInfo; + +@Mixin(BuiltinRegistries.class) +public class BuiltinRegistriesMixin { + + @Inject(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Map;forEach(Ljava/util/function/BiConsumer;)V")) + private static void together_registerSurface(CallbackInfo ci) { + SurfaceRuleRegistry.SURFACE_RULES = (Registry) registerSimple( + SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, + SurfaceRuleRegistry::bootstrap + ); + } + + @Shadow + static protected Registry registerSimple( + ResourceKey> resourceKey, BuiltinRegistries.RegistryBootstrap registryBootstrap + ) { + throw new RuntimeException("Shadowed Call"); + } +} diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/RegistryAccessMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/RegistryAccessMixin.java new file mode 100644 index 00000000..c6cf0689 --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/mixin/common/RegistryAccessMixin.java @@ -0,0 +1,46 @@ +package org.betterx.worlds.together.mixin.common; + +import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.SurfaceRules; + +import com.google.common.collect.ImmutableMap; +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.ModifyArg; + +import java.util.Map; +import java.util.function.Supplier; + +@Mixin(RegistryAccess.class) +public interface RegistryAccessMixin { + + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;make(Ljava/util/function/Supplier;)Ljava/lang/Object;")) + private static Supplier>, RegistryAccess.RegistryData>> together_addRegistry( + Supplier>, RegistryAccess.RegistryData>> supplier + ) { + return () -> { + Map>, RegistryAccess.RegistryData> res = supplier.get(); + ImmutableMap.Builder>, RegistryAccess.RegistryData> builder = ImmutableMap.builder(); + + builder.putAll(res); + put(builder, SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, SurfaceRules.RuleSource.CODEC); + return builder.build(); + }; + } + + @Shadow + static void put( + ImmutableMap.Builder>, RegistryAccess.RegistryData> builder, + ResourceKey> resourceKey, + Codec codec + ) { + throw new RuntimeException("Shadowed Call"); + } + +} diff --git a/src/main/java/org/betterx/worlds/together/surfaceRules/AssignedSurfaceRule.java b/src/main/java/org/betterx/worlds/together/surfaceRules/AssignedSurfaceRule.java new file mode 100644 index 00000000..ba3b51d4 --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/surfaceRules/AssignedSurfaceRule.java @@ -0,0 +1,15 @@ +package org.betterx.worlds.together.surfaceRules; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.SurfaceRules; + +public class AssignedSurfaceRule { + public final SurfaceRules.RuleSource ruleSource; + public final ResourceLocation biomeID; + + AssignedSurfaceRule(SurfaceRules.RuleSource ruleSource, ResourceLocation biomeID) { + this.ruleSource = ruleSource; + this.biomeID = biomeID; + } + +} diff --git a/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleRegistry.java b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleRegistry.java new file mode 100644 index 00000000..c9b3435d --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/surfaceRules/SurfaceRuleRegistry.java @@ -0,0 +1,35 @@ +package org.betterx.worlds.together.surfaceRules; + +import org.betterx.worlds.together.WorldsTogether; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.SurfaceRules; + +public class SurfaceRuleRegistry { + public static final ResourceKey> SURFACE_RULES_REGISTRY = + createRegistryKey(WorldsTogether.makeID("worldgen/surface_rules")); + + public static Registry SURFACE_RULES; + + private static ResourceKey> createRegistryKey(ResourceLocation location) { + return ResourceKey.createRegistryKey(location); + } + + public static Holder bootstrap(Registry registry) { + return BuiltinRegistries.register( + registry, + WorldsTogether.makeID("test"), + SurfaceRules.state(Blocks.SCULK.defaultBlockState()) + ); + } + + public static void ensureStaticallyLoaded() { + + } + +} diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java b/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java index a0458b1c..56220463 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java @@ -31,7 +31,6 @@ public abstract class WorldPresetSettings { private static ResourceKey> createRegistryKey(ResourceLocation location) { - return ResourceKey.createRegistryKey(location); } diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index 673c1787..63d4973e 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -10,6 +10,7 @@ accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyCondition accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource accessible class net/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator +accessible class net/minecraft/data/BuiltinRegistries$RegistryBootstrap #Methods accessible method net/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent updateSettings (Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext$Updater;)V diff --git a/src/main/resources/data/worlds_together/worldgen/surface_rules/empty.json b/src/main/resources/data/worlds_together/worldgen/surface_rules/empty.json new file mode 100644 index 00000000..2ee8f623 --- /dev/null +++ b/src/main/resources/data/worlds_together/worldgen/surface_rules/empty.json @@ -0,0 +1,6 @@ +{ + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dead_fire_coral_block" + } +} \ No newline at end of file diff --git a/src/main/resources/together.mixins.common.json b/src/main/resources/together.mixins.common.json index 53f30cce..9a979c70 100644 --- a/src/main/resources/together.mixins.common.json +++ b/src/main/resources/together.mixins.common.json @@ -4,9 +4,11 @@ "package": "org.betterx.worlds.together.mixin.common", "compatibilityLevel": "JAVA_17", "mixins": [ + "BuiltinRegistriesMixin", "DiggerItemAccessor", "MainMixin", "PrimaryLevelDataMixin", + "RegistryAccessMixin", "RegistryOpsAccessor", "TagLoaderMixin", "WorldGenPropertiesMixin",