Compiles, can get ingame, uses Mixins to work around missing Fork Hooks for structures and custom dimensions.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<Feature<?>> evt) {
|
||||
public void registerFeatures(RegistryEvent.Register<Feature<?>> evt) {
|
||||
IForgeRegistry<Feature<?>> r = evt.getRegistry();
|
||||
|
||||
r.register(ChargedQuartzOreFeature.INSTANCE);
|
||||
r.register(ChargedQuartzOreFeature.INSTANCE.setRegistryName(AppEng.makeId("charged_quartz_ore")));
|
||||
}
|
||||
|
||||
public void registerStructures(RegistryEvent.Register<Structure<?>> 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<Biome> evt) {
|
||||
evt.getRegistry().register(StorageCellBiome.INSTANCE);
|
||||
evt.getRegistry().register(StorageCellBiome.INSTANCE.setRegistryName(AppEng.makeId("storage")));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
||||
@@ -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.
|
||||
* <p>
|
||||
* 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<Structure<?>, StructureSeparationSettings> field_236191_b_;
|
||||
|
||||
@Inject(method = "<clinit>", at = @At("TAIL"))
|
||||
private static void addMeteoriteSpreadConfig(CallbackInfo ci) {
|
||||
field_236191_b_ = ImmutableMap.<Structure<?>, StructureSeparationSettings>builder()
|
||||
.putAll(field_236191_b_)
|
||||
.put(MeteoriteStructure.INSTANCE, new StructureSeparationSettings(32, 8, 124895654)).build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"))
|
||||
|
||||
@@ -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<RegistryKey<DimensionType>> optional,
|
||||
CallbackInfoReturnable<DimensionRenderInfo> ci) {
|
||||
if (optional.orElse(null) == SpatialDimensionManager.STORAGE_DIMENSION_TYPE) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 extends Structure<?>> F register(String id, F feature, GenerationStage.Decoration defaultStage) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,7 +21,7 @@ public class ChargedQuartzOreFeature extends Feature<ChargedQuartzOreConfig> {
|
||||
|
||||
public static final ChargedQuartzOreFeature INSTANCE = new ChargedQuartzOreFeature(ChargedQuartzOreConfig.CODEC);
|
||||
|
||||
public ChargedQuartzOreFeature(Codec<ChargedQuartzOreConfig> codec) {
|
||||
private ChargedQuartzOreFeature(Codec<ChargedQuartzOreConfig> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<NoFeatureConfig> {
|
||||
|
||||
public static final ResourceLocation ID = AppEng.makeId("meteorite");
|
||||
@@ -29,6 +22,12 @@ public class MeteoriteStructure extends Structure<NoFeatureConfig> {
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user