From e640918ca0a1826356941f5f23db1935f235f5e3 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Tue, 28 Jul 2020 02:05:24 +0200 Subject: [PATCH] Compiles, can get ingame, uses Mixins to work around missing Fork Hooks for structures and custom dimensions. --- build.gradle | 16 +++ src/main/java/appeng/core/AppEng.java | 4 +- src/main/java/appeng/core/Registration.java | 110 ++++++++++-------- .../DimensionStructuresSettingsMixin.java | 36 ++++++ .../appeng/mixins/DimensionTypeMixin.java | 2 +- .../appeng/mixins/SkyPropertiesMixin.java | 2 +- .../java/appeng/mixins/SkyRenderMixin.java | 10 +- .../java/appeng/mixins/StructureAccessor.java | 16 +++ src/main/java/appeng/mixins/TntAccessor.java | 20 ---- .../worldgen/ChargedQuartzOreFeature.java | 2 +- .../meteorite/MeteoriteStructure.java | 15 ++- src/main/resources/META-INF/MANIFEST.MF | 1 + src/main/resources/META-INF/mods.toml | 6 +- .../resources/appliedenergistics2.mixins.json | 21 ++++ 14 files changed, 170 insertions(+), 91 deletions(-) create mode 100644 src/main/java/appeng/mixins/DimensionStructuresSettingsMixin.java create mode 100644 src/main/java/appeng/mixins/StructureAccessor.java delete mode 100644 src/main/java/appeng/mixins/TntAccessor.java create mode 100644 src/main/resources/META-INF/MANIFEST.MF create mode 100644 src/main/resources/appliedenergistics2.mixins.json diff --git a/build.gradle b/build.gradle index 159a8772c..af88836f7 100644 --- a/build.gradle +++ b/build.gradle @@ -19,11 +19,13 @@ buildscript { repositories { maven { url = 'https://files.minecraftforge.net/maven' } + maven { url = 'https://repo.spongepowered.org/maven' } jcenter() mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' } } @@ -36,6 +38,7 @@ plugins { } apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.spongepowered.mixin' apply plugin: "eclipse" repositories { @@ -112,6 +115,7 @@ minecraft { client { property 'forge.logging.console.level', 'debug' workingDirectory project.file('run') + property "mixin.debug.export", "true" mods { appliedenergistics2 { source sourceSets.main @@ -143,6 +147,18 @@ minecraft { } } +mixin { + add sourceSets.main, "mixins.appliedenergistics2.refmap.json" +} + +jar { + manifest { + attributes([ + "MixinConfigs": "appliedenergistics2.mixins.json" + ]) + } +} + def signProps = [:] if (System.getenv("KEY_STORE_FILE")) { signProps['keyStore'] = System.getenv("KEY_STORE_FILE") diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index 9c61d3bb5..f3be46f62 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -37,6 +37,7 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraft.world.biome.Biome; 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.model.ModelLoaderRegistry; @@ -130,7 +131,8 @@ public final class AppEng { modEventBus.addGenericListener(TileEntityType.class, registration::registerTileEntities); modEventBus.addGenericListener(ContainerType.class, registration::registerContainerTypes); modEventBus.addGenericListener(IRecipeSerializer.class, registration::registerRecipeSerializers); - modEventBus.addGenericListener(Feature.class, registration::registerWorldGen); + modEventBus.addGenericListener(Feature.class, registration::registerFeatures); + modEventBus.addGenericListener(Structure.class, registration::registerStructures); modEventBus.addGenericListener(Biome.class, registration::registerBiomes); modEventBus.addListener(Integrations::enqueueIMC); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 73f2afbdc..a57dcf41a 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -18,48 +18,6 @@ package appeng.core; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScreenManager; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.entity.EntityType; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.Item; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.particles.ParticleType; -import net.minecraft.tileentity.TileEntityType; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.DimensionType; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.GenerationStage; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.IFeatureConfig; -import net.minecraft.world.gen.feature.OreFeatureConfig; -import net.minecraft.world.gen.placement.CountRangeConfig; -import net.minecraft.world.gen.placement.IPlacementConfig; -import net.minecraft.world.gen.placement.Placement; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.ColorHandlerEvent; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; -import net.minecraftforge.client.event.TextureStitchEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.common.extensions.IForgeContainerType; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.event.server.FMLServerStartingEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLEnvironment; -import net.minecraftforge.fml.network.IContainerFactory; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.IForgeRegistry; - import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IItems; @@ -195,6 +153,7 @@ import appeng.me.cache.PathGridCache; import appeng.me.cache.SecurityCache; import appeng.me.cache.SpatialPylonCache; import appeng.me.cache.TickManagerCache; +import appeng.mixins.StructureAccessor; import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; import appeng.recipes.handlers.GrinderRecipe; @@ -208,15 +167,51 @@ import appeng.tile.crafting.MolecularAssemblerRenderer; import appeng.worldgen.ChargedQuartzOreConfig; import appeng.worldgen.ChargedQuartzOreFeature; import appeng.worldgen.meteorite.MeteoriteStructure; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScreenManager; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.entity.EntityType; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.particles.ParticleType; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.feature.structure.Structure; +import net.minecraft.world.gen.placement.CountRangeConfig; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.placement.Placement; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.ColorHandlerEvent; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.extensions.IForgeContainerType; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.network.IContainerFactory; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.IForgeRegistry; final class Registration { - public Registration() { - AeStats.register(); - advancementTriggers = new AdvancementTriggers(CriteriaTriggers::register); - } - - AdvancementTriggers advancementTriggers; + static AdvancementTriggers advancementTriggers; public static void setupInternalRegistries() { // TODO: Do not use the internal API @@ -468,6 +463,9 @@ final class Registration { // FIXME LATER public static void postInit() { + AeStats.register(); + advancementTriggers = new AdvancementTriggers(CriteriaTriggers::register); + final IRegistryContainer registries = Api.instance().registries(); // TODO: Do not use the internal API ApiDefinitions definitions = Api.INSTANCE.definitions(); @@ -682,14 +680,24 @@ final class Registration { } } - public void registerWorldGen(RegistryEvent.Register> evt) { + public void registerFeatures(RegistryEvent.Register> evt) { IForgeRegistry> r = evt.getRegistry(); - r.register(ChargedQuartzOreFeature.INSTANCE); + r.register(ChargedQuartzOreFeature.INSTANCE.setRegistryName(AppEng.makeId("charged_quartz_ore"))); + } + + public void registerStructures(RegistryEvent.Register> evt) { + // Registering into the Forge registry is INSUFFICIENT! + // There's a bidirectional map in the Structure class itself primarily for the purposes of NBT serialization + StructureAccessor.register( + MeteoriteStructure.ID.toString(), + MeteoriteStructure.INSTANCE.setRegistryName(MeteoriteStructure.ID), + GenerationStage.Decoration.TOP_LAYER_MODIFICATION + ); } public void registerBiomes(RegistryEvent.Register evt) { - evt.getRegistry().register(StorageCellBiome.INSTANCE); + evt.getRegistry().register(StorageCellBiome.INSTANCE.setRegistryName(AppEng.makeId("storage"))); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/appeng/mixins/DimensionStructuresSettingsMixin.java b/src/main/java/appeng/mixins/DimensionStructuresSettingsMixin.java new file mode 100644 index 000000000..ed366a7db --- /dev/null +++ b/src/main/java/appeng/mixins/DimensionStructuresSettingsMixin.java @@ -0,0 +1,36 @@ +package appeng.mixins; + +import appeng.worldgen.meteorite.MeteoriteStructure; +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.gen.feature.structure.Structure; +import net.minecraft.world.gen.settings.DimensionStructuresSettings; +import net.minecraft.world.gen.settings.StructureSeparationSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +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; + +/** + * This Mixin will add the structure placement configuration for the meteorite structure + * to the static final immutable map that contains them. There is currently no + * Forge hook for this, and registering them during the registry event is already too late. + *

+ * If this is not done, Meteorites spawn every chunk, since that is the default for missing entries. + */ +@Mixin(DimensionStructuresSettings.class) +public class DimensionStructuresSettingsMixin { + + @Shadow + @Mutable + private static ImmutableMap, StructureSeparationSettings> field_236191_b_; + + @Inject(method = "", at = @At("TAIL")) + private static void addMeteoriteSpreadConfig(CallbackInfo ci) { + field_236191_b_ = ImmutableMap., StructureSeparationSettings>builder() + .putAll(field_236191_b_) + .put(MeteoriteStructure.INSTANCE, new StructureSeparationSettings(32, 8, 124895654)).build(); + } + +} diff --git a/src/main/java/appeng/mixins/DimensionTypeMixin.java b/src/main/java/appeng/mixins/DimensionTypeMixin.java index 29fd2a0ad..800c32425 100644 --- a/src/main/java/appeng/mixins/DimensionTypeMixin.java +++ b/src/main/java/appeng/mixins/DimensionTypeMixin.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.OptionalLong; -@Mixin(DimensionType.class) +@Mixin(value = DimensionType.class) public class DimensionTypeMixin { @Inject(method = "func_236027_a_", at = @At("TAIL")) diff --git a/src/main/java/appeng/mixins/SkyPropertiesMixin.java b/src/main/java/appeng/mixins/SkyPropertiesMixin.java index cb2c9ab0b..a6a0e8628 100644 --- a/src/main/java/appeng/mixins/SkyPropertiesMixin.java +++ b/src/main/java/appeng/mixins/SkyPropertiesMixin.java @@ -14,7 +14,7 @@ import java.util.Optional; @Mixin(DimensionRenderInfo.class) public class SkyPropertiesMixin { - @Inject(method = "func_239215_a_", at = @At("HEAD"), cancellable = true, remap = false) + @Inject(method = "func_239215_a_", at = @At("HEAD"), cancellable = true) private static void byDimensionType(Optional> optional, CallbackInfoReturnable ci) { if (optional.orElse(null) == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) { diff --git a/src/main/java/appeng/mixins/SkyRenderMixin.java b/src/main/java/appeng/mixins/SkyRenderMixin.java index b7f5ee18d..3d4c89399 100644 --- a/src/main/java/appeng/mixins/SkyRenderMixin.java +++ b/src/main/java/appeng/mixins/SkyRenderMixin.java @@ -11,16 +11,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(WorldRenderer.class) +@Mixin(value = WorldRenderer.class) public class SkyRenderMixin { - @Shadow(aliases = {"mc"}) - private Minecraft client; + @Shadow + private Minecraft mc; @SuppressWarnings("ConstantConditions") - @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderSky(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", at = @At("HEAD"), cancellable = true) public void renderSky(MatrixStack matrices, float tickDelta, CallbackInfo ci) { - if (client.world.func_234922_V_() == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) { + if (mc.world.func_234922_V_() == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) { SpatialSkyRender.getInstance().render(matrices); ci.cancel(); } diff --git a/src/main/java/appeng/mixins/StructureAccessor.java b/src/main/java/appeng/mixins/StructureAccessor.java new file mode 100644 index 000000000..b39ceb72a --- /dev/null +++ b/src/main/java/appeng/mixins/StructureAccessor.java @@ -0,0 +1,16 @@ +package appeng.mixins; + +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.structure.Structure; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Structure.class) +public interface StructureAccessor { + + @Invoker("func_236394_a_") + static > F register(String id, F feature, GenerationStage.Decoration defaultStage) { + throw new AssertionError(); + } + +} diff --git a/src/main/java/appeng/mixins/TntAccessor.java b/src/main/java/appeng/mixins/TntAccessor.java deleted file mode 100644 index 93e442caa..000000000 --- a/src/main/java/appeng/mixins/TntAccessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package appeng.mixins; - -import net.minecraft.block.TNTBlock; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import javax.annotation.Nullable; - -@Mixin(TNTBlock.class) -public interface TntAccessor { - - @Invoker - static void callPrimeTnt(World world, BlockPos pos, @Nullable LivingEntity igniter) { - throw new AssertionError("Mixin dummy"); - } - -} diff --git a/src/main/java/appeng/worldgen/ChargedQuartzOreFeature.java b/src/main/java/appeng/worldgen/ChargedQuartzOreFeature.java index 887b10d5b..34e679b93 100644 --- a/src/main/java/appeng/worldgen/ChargedQuartzOreFeature.java +++ b/src/main/java/appeng/worldgen/ChargedQuartzOreFeature.java @@ -21,7 +21,7 @@ public class ChargedQuartzOreFeature extends Feature { public static final ChargedQuartzOreFeature INSTANCE = new ChargedQuartzOreFeature(ChargedQuartzOreConfig.CODEC); - public ChargedQuartzOreFeature(Codec codec) { + private ChargedQuartzOreFeature(Codec codec) { super(codec); } diff --git a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java index dcf0c5b2f..414c3ef1c 100644 --- a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java +++ b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java @@ -1,23 +1,16 @@ package appeng.worldgen.meteorite; -import java.util.Random; - +import appeng.core.AppEng; import com.mojang.serialization.Codec; - import net.minecraft.util.ResourceLocation; import net.minecraft.util.SharedSeedRandom; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeManager; import net.minecraft.world.biome.provider.BiomeProvider; import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.gen.feature.NoFeatureConfig; -import net.minecraft.world.gen.feature.StructureFeature; import net.minecraft.world.gen.feature.structure.Structure; -import appeng.core.AELog; -import appeng.core.AppEng; - public class MeteoriteStructure extends Structure { public static final ResourceLocation ID = AppEng.makeId("meteorite"); @@ -29,6 +22,12 @@ public class MeteoriteStructure extends Structure { 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, NoFeatureConfig featureConfig) { return randIn.nextBoolean(); diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..99aa76f3e --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1 @@ +MixinConfigs: appliedenergistics2.mixins.json diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 96143ca28..26f317367 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[31,)" +loaderVersion="[32,)" #updateJSONURL="" issueTrackerURL="https://github.com/AppliedEnergistics/Applied-Energistics-2/issues" displayURL="https://github.com/AppliedEnergistics/Applied-Energistics-2" @@ -16,13 +16,13 @@ description="A Mod about Matter, Energy and using them to conquer the world.." [[dependencies.appliedenergistics2]] modId="forge" mandatory=true - versionRange="[31.2.31,32.0.0)" + versionRange="[32.0.75,33.0.0)" ordering="NONE" side="BOTH" [[dependencies.appliedenergistics2]] modId="minecraft" mandatory=true - versionRange="[1.15.2]" + versionRange="[1.16.1]" ordering="NONE" side="BOTH" diff --git a/src/main/resources/appliedenergistics2.mixins.json b/src/main/resources/appliedenergistics2.mixins.json new file mode 100644 index 000000000..dc34c44b5 --- /dev/null +++ b/src/main/resources/appliedenergistics2.mixins.json @@ -0,0 +1,21 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "appeng.mixins", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "DimensionTypeMixin", + "MinecraftServerMixin", + "ThreadedAnvilChunkStorageAccessor", + "DimensionStructuresSettingsMixin", + "StructureAccessor" + ], + "client": [ + "SkyRenderMixin", + "SkyPropertiesMixin" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + } +}