diff --git a/gradle.properties b/gradle.properties index 8d3587809f3..821f9baf16d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ artifact_basename=appliedenergistics2 minecraft_release=1.16 minecraft_version=1.16.3 mcp_mappings=20200916-1.16.2 -forge_version=34.1.15 +forge_version=34.1.33 ######################################################### # Provided APIs # diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index 0316326adf2..bcb18ef8783 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -34,6 +34,8 @@ import net.minecraft.particles.ParticleType; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.structure.Structure; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.MinecraftForge; @@ -108,6 +110,8 @@ public AppEng() { modEventBus.addGenericListener(TileEntityType.class, registration::registerTileEntities); modEventBus.addGenericListener(ContainerType.class, registration::registerContainerTypes); modEventBus.addGenericListener(IRecipeSerializer.class, registration::registerRecipeSerializers); + modEventBus.addGenericListener(Structure.class, registration::registerStructures); + modEventBus.addGenericListener(Feature.class, registration::registerFeatures); modEventBus.addListener(Integrations::enqueueIMC); modEventBus.addListener(this::commonSetup); diff --git a/src/main/java/appeng/core/AppEngBootstrap.java b/src/main/java/appeng/core/AppEngBootstrap.java index acc91ab52df..801ae3d508e 100644 --- a/src/main/java/appeng/core/AppEngBootstrap.java +++ b/src/main/java/appeng/core/AppEngBootstrap.java @@ -14,15 +14,12 @@ import appeng.api.features.AEFeature; import appeng.mixins.feature.ConfiguredFeaturesAccessor; -import appeng.mixins.structure.ConfiguredStructureFeaturesAccessor; -import appeng.mixins.structure.StructureFeatureAccessor; import appeng.spatial.SpatialStorageChunkGenerator; import appeng.spatial.SpatialStorageDimensionIds; import appeng.worldgen.BiomeModifier; import appeng.worldgen.ChargedQuartzOreConfig; import appeng.worldgen.ChargedQuartzOreFeature; import appeng.worldgen.meteorite.MeteoriteStructure; -import appeng.worldgen.meteorite.MeteoriteStructurePiece; /** * Hooks into the very early bootstrapping phase to register things before the @@ -43,8 +40,6 @@ public synchronized static void initialize() { } initialized = true; - registerStructures(); - quartzOreFeature = registerQuartzOreFeature(); chargedQuartzOreFeature = registerChargedQuartzOreFeature(); @@ -60,20 +55,6 @@ public synchronized static void enhanceBiomes() { }); } - private static void registerStructures() { - - MeteoriteStructurePiece.register(); - - // Registering into the registry alone is INSUFFICIENT! - // There's a bidirectional map in the Structure class itself primarily for the - // purposes of NBT serialization - StructureFeatureAccessor.register(MeteoriteStructure.ID.toString(), MeteoriteStructure.INSTANCE, - GenerationStage.Decoration.TOP_LAYER_MODIFICATION); - - ConfiguredStructureFeaturesAccessor.register(MeteoriteStructure.ID.toString(), - MeteoriteStructure.CONFIGURED_INSTANCE); - } - private static void addMeteoriteWorldGen(Biome b) { if (!AEConfig.instance().isFeatureEnabled(AEFeature.METEORITE_WORLD_GEN)) { return; @@ -114,9 +95,6 @@ private static void addQuartzWorldGen(Biome b, ConfiguredFeature quartzOre } private static ConfiguredFeature registerChargedQuartzOreFeature() { - // Tell Minecraft about our configured charged quartz ore feature - Registry.register(Registry.FEATURE, AppEng.makeId("charged_quartz_ore"), ChargedQuartzOreFeature.INSTANCE); - BlockState quartzOreState = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); BlockState chargedQuartzOreState = Api.instance().definitions().blocks().quartzOreCharged().block() .getDefaultState(); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 2007758a6bb..38bf243a150 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -18,6 +18,7 @@ package appeng.core; +import java.util.Locale; import java.util.function.Supplier; import net.minecraft.advancements.CriteriaTriggers; @@ -32,7 +33,11 @@ import net.minecraft.particles.ParticleType; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; import net.minecraft.world.World; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.structure.Structure; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.ColorHandlerEvent; @@ -200,6 +205,7 @@ import appeng.me.cache.SecurityCache; import appeng.me.cache.SpatialPylonCache; import appeng.me.cache.TickManagerCache; +import appeng.mixins.structure.ConfiguredStructureFeaturesAccessor; import appeng.parts.automation.PlaneModelLoader; import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; @@ -208,6 +214,9 @@ import appeng.server.AECommand; import appeng.tile.AEBaseTileEntity; import appeng.tile.crafting.MolecularAssemblerRenderer; +import appeng.worldgen.ChargedQuartzOreFeature; +import appeng.worldgen.meteorite.MeteoriteStructure; +import appeng.worldgen.meteorite.MeteoriteStructurePiece; final class Registration { @@ -475,6 +484,37 @@ public void registerParticleTypes(RegistryEvent.Register> event) registry.register(ParticleTypes.VIBRANT); } + public void registerStructures(RegistryEvent.Register> event) { + MeteoriteStructurePiece.register(); + + // Registering into the registry alone is INSUFFICIENT! + // There's a bidirectional map in the Structure class itself primarily for the + // purposes of NBT serialization + registerStructure(event.getRegistry(), MeteoriteStructure.ID.toString(), MeteoriteStructure.INSTANCE, + GenerationStage.Decoration.TOP_LAYER_MODIFICATION); + + ConfiguredStructureFeaturesAccessor.register(MeteoriteStructure.ID.toString(), + MeteoriteStructure.CONFIGURED_INSTANCE); + } + + // This mirrors the Vanilla registration method for structures, but uses the + // Forge registry instead + private static > void registerStructure(IForgeRegistry> registry, String name, + F structure, GenerationStage.Decoration stage) { + Structure.field_236365_a_.put(name.toLowerCase(Locale.ROOT), structure); + Structure.field_236385_u_.put(structure, stage); + structure.setRegistryName(name.toLowerCase(Locale.ROOT)); + registry.register(structure); + } + + public void registerFeatures(RegistryEvent.Register> event) { + IForgeRegistry> registry = event.getRegistry(); + + // Tell Minecraft about our charged quartz ore feature + ChargedQuartzOreFeature.INSTANCE.setRegistryName(AppEng.makeId("charged_quartz_ore")); + registry.register(ChargedQuartzOreFeature.INSTANCE); + } + @OnlyIn(Dist.CLIENT) public void registerParticleFactories(ParticleFactoryRegisterEvent event) { ParticleManager particles = Minecraft.getInstance().particles; @@ -699,4 +739,5 @@ public void registerClientEvents() { modEventBus.addListener(this::registerItemColors); modEventBus.addListener(this::handleModelBake); } + } diff --git a/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java b/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java deleted file mode 100644 index 74c786f285e..00000000000 --- a/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package appeng.mixins.structure; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.world.gen.GenerationStage; -import net.minecraft.world.gen.feature.structure.Structure; - -@Mixin(Structure.class) -public interface StructureFeatureAccessor { - - @Invoker("func_236394_a_") - static > F register(String id, F structureFeature, GenerationStage.Decoration step) { - throw new AssertionError(); - } - -} diff --git a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java index bc6602a34a9..048cc705fc1 100644 --- a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java +++ b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java @@ -27,12 +27,6 @@ public MeteoriteStructure(Codec configCodec) { super(configCodec); } - @Override - public String getStructureName() { - String s = super.getStructureName(); - return s; - } - @Override protected boolean func_230363_a_(ChunkGenerator generator, BiomeProvider biomeSource, long seed, SharedSeedRandom randIn, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos2, diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 779f78285db..78b8f1bc4e5 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -20,3 +20,5 @@ protected net.minecraft.entity.item.ItemEntity func_203043_v()V # applyFloatMoti # Registration of custom DimensionType public net.minecraft.world.DimensionType (Ljava/util/OptionalLong;ZZZZZZZZZILnet/minecraft/util/ResourceLocation;F)V + +public net.minecraft.world.gen.feature.structure.Structure field_236385_u_ diff --git a/src/main/resources/appliedenergistics2.mixins.json b/src/main/resources/appliedenergistics2.mixins.json index bae24bceaef..78e5cbc4db4 100644 --- a/src/main/resources/appliedenergistics2.mixins.json +++ b/src/main/resources/appliedenergistics2.mixins.json @@ -11,7 +11,6 @@ "spatial.BiomesMixin", "structure.DimensionStructuresSettingsMixin", "structure.ConfiguredStructureFeaturesAccessor", - "structure.StructureFeatureAccessor", "structure.GenerationSettingsAccessor", "structure.BiomeAccessor", "feature.ConfiguredFeaturesAccessor"