From 198ea9f16ed84f5d135b6674706d937c202b351c Mon Sep 17 00:00:00 2001 From: Gunther De Wachter Date: Thu, 6 Jul 2017 14:05:54 +0200 Subject: [PATCH] Fixed crash caused by delayed block registration. Added Callback section for the Model Registry event to the builder setup. Moved the State Mapper section to the Model Registry Callback section. --- .../bootstrap/BlockDefinitionBuilder.java | 16 +++--- .../java/appeng/bootstrap/BlockRendering.java | 2 +- .../java/appeng/bootstrap/FeatureFactory.java | 6 +++ .../java/appeng/bootstrap/IBlockBuilder.java | 2 + .../appeng/bootstrap/IBootstrapComponent.java | 4 ++ .../components/ModelRegComponent.java | 15 ++++++ .../components/StateMapperComponent.java | 4 +- src/main/java/appeng/core/Registration.java | 53 ++++++------------- 8 files changed, 57 insertions(+), 45 deletions(-) create mode 100644 src/main/java/appeng/bootstrap/components/ModelRegComponent.java diff --git a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java index 4698cf9a7c5..2476a705042 100644 --- a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java @@ -36,9 +36,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.gui.ForgeGuiFactory; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -71,6 +68,8 @@ class BlockDefinitionBuilder implements IBlockBuilder private final List> initCallbacks = new ArrayList<>(); + private final List> modelRegCallbacks = new ArrayList<>(); + private final List> postInitCallbacks = new ArrayList<>(); private final EnumSet features = EnumSet.noneOf( AEFeature.class ); @@ -116,6 +115,13 @@ public BlockDefinitionBuilder init( BiConsumer callback ) return this; } + @Override + public BlockDefinitionBuilder modelRegInit( BiConsumer callback ) + { + modelRegCallbacks.add( callback ); + return this; + } + @Override public BlockDefinitionBuilder postInit( BiConsumer callback ) { @@ -215,13 +221,10 @@ public T build() // Register the item and block with the game factory.addPreInit( side -> { - // GameRegistry.register( block ); Registration.addBlockToRegister( block ); -// ForgeRegistries.BLOCKS.register(block); if( item != null ) { Registration.addItemToRegister( item ); -// ForgeRegistries.ITEMS.register(item); } } ); @@ -231,6 +234,7 @@ public T build() // Register all extra handlers preInitCallbacks.forEach( consumer -> factory.addPreInit( side -> consumer.accept( block, item ) ) ); initCallbacks.forEach( consumer -> factory.addInit( side -> consumer.accept( block, item ) ) ); + modelRegCallbacks.forEach(consumer -> factory.addModelReg(side -> consumer.accept( block, item ) ) ); postInitCallbacks.forEach( consumer -> factory.addPostInit( side -> consumer.accept( block, item ) ) ); diff --git a/src/main/java/appeng/bootstrap/BlockRendering.java b/src/main/java/appeng/bootstrap/BlockRendering.java index 7b2fc4ba36d..cfbf019df1e 100644 --- a/src/main/java/appeng/bootstrap/BlockRendering.java +++ b/src/main/java/appeng/bootstrap/BlockRendering.java @@ -120,7 +120,7 @@ else if( block instanceof AEBaseTileBlock ) } // TODO : 1.12 - builtInModels.forEach( factory::addBuiltInModel ); + builtInModels.forEach( factory::addBuiltInModel ); if( blockColor != null ) { diff --git a/src/main/java/appeng/bootstrap/FeatureFactory.java b/src/main/java/appeng/bootstrap/FeatureFactory.java index d7e2a03aee3..b02bc8cf7a6 100644 --- a/src/main/java/appeng/bootstrap/FeatureFactory.java +++ b/src/main/java/appeng/bootstrap/FeatureFactory.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.function.Supplier; +import appeng.bootstrap.components.ModelRegComponent; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraftforge.client.model.IModel; @@ -129,6 +130,11 @@ void addInit( InitComponent component ) this.bootstrapComponents.add( component ); } + void addModelReg( ModelRegComponent component ) + { + this.bootstrapComponents.add( component ); + } + void addPostInit( PostInitComponent component ) { this.bootstrapComponents.add( component ); diff --git a/src/main/java/appeng/bootstrap/IBlockBuilder.java b/src/main/java/appeng/bootstrap/IBlockBuilder.java index 2ae83910119..41199db1461 100644 --- a/src/main/java/appeng/bootstrap/IBlockBuilder.java +++ b/src/main/java/appeng/bootstrap/IBlockBuilder.java @@ -38,6 +38,8 @@ public interface IBlockBuilder IBlockBuilder init( BiConsumer callback ); + IBlockBuilder modelRegInit( BiConsumer callback ); + IBlockBuilder postInit( BiConsumer callback ); IBlockBuilder features( AEFeature... features ); diff --git a/src/main/java/appeng/bootstrap/IBootstrapComponent.java b/src/main/java/appeng/bootstrap/IBootstrapComponent.java index e6f8d030f0f..5e1d0cd52b0 100644 --- a/src/main/java/appeng/bootstrap/IBootstrapComponent.java +++ b/src/main/java/appeng/bootstrap/IBootstrapComponent.java @@ -32,6 +32,10 @@ default void preInitialize( Side side ) { } + default void modelLoader( Side side ) + { + } + default void initialize( Side side ) { } diff --git a/src/main/java/appeng/bootstrap/components/ModelRegComponent.java b/src/main/java/appeng/bootstrap/components/ModelRegComponent.java new file mode 100644 index 00000000000..b9f6827c8ba --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ModelRegComponent.java @@ -0,0 +1,15 @@ +package appeng.bootstrap.components; + +import appeng.bootstrap.IBootstrapComponent; +import net.minecraftforge.fml.relauncher.Side; + +/** + * @author GuntherDW + */ + +@FunctionalInterface +public interface ModelRegComponent extends IBootstrapComponent { + + void modelReg(Side side); + +} diff --git a/src/main/java/appeng/bootstrap/components/StateMapperComponent.java b/src/main/java/appeng/bootstrap/components/StateMapperComponent.java index 93d79bbea79..d19d85e17e1 100644 --- a/src/main/java/appeng/bootstrap/components/StateMapperComponent.java +++ b/src/main/java/appeng/bootstrap/components/StateMapperComponent.java @@ -31,7 +31,7 @@ /** * Registers a custom state mapper for a given block. */ -public class StateMapperComponent implements PreInitComponent +public class StateMapperComponent implements ModelRegComponent { private final Block block; @@ -45,7 +45,7 @@ public StateMapperComponent( Block block, IStateMapper stateMapper ) } @Override - public void preInitialize( Side side ) + public void modelReg( Side side ) { ModelLoader.setCustomStateMapper( block, stateMapper ); if( stateMapper instanceof IResourceManagerReloadListener ) diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index b16e18b67ca..85a9601a2a6 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -20,7 +20,6 @@ import java.io.File; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -28,11 +27,7 @@ import javax.annotation.Nonnull; -import appeng.api.definitions.IBlockDefinition; -import appeng.api.definitions.IItemDefinition; -import appeng.api.definitions.ITileDefinition; -import appeng.api.util.AEColoredItemDefinition; -import appeng.core.api.definitions.ApiBlocks; +import appeng.util.Platform; import com.google.common.base.Preconditions; import net.minecraft.block.Block; @@ -40,16 +35,14 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.DimensionType; import net.minecraft.world.biome.Biome; -import net.minecraftforge.common.BiomeManager; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.API; -import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.RecipeSorter.Category; @@ -83,7 +76,6 @@ import appeng.hooks.TickHandler; import appeng.integration.Integrations; import appeng.items.materials.ItemMaterial; -import appeng.items.parts.ItemFacade; import appeng.loot.ChestLoot; import appeng.me.cache.CraftingGridCache; import appeng.me.cache.EnergyGridCache; @@ -97,7 +89,6 @@ import appeng.recipes.AEItemResolver; import appeng.recipes.CustomRecipeConfig; import appeng.recipes.RecipeHandler; -import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; import appeng.recipes.game.ShapedRecipe; import appeng.recipes.game.ShapelessRecipe; @@ -117,13 +108,10 @@ import appeng.spatial.BiomeGenStorage; import appeng.spatial.StorageWorldProvider; import appeng.tile.AEBaseTile; -import appeng.util.Platform; import appeng.worldgen.MeteoriteWorldGen; import appeng.worldgen.QuartzWorldGen; -import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.IForgeRegistry; -@Mod.EventBusSubscriber(modid = AppEng.MOD_ID) public final class Registration { private final RecipeHandler recipeHandler; @@ -368,56 +356,49 @@ public void initialize( @Nonnull final FMLInitializationEvent event, @Nonnull fi } @SubscribeEvent - void registerBiomes ( RegistryEvent.Register event ) + public void registerBiomes ( RegistryEvent.Register event ) { IForgeRegistry registry = event.getRegistry(); this.registerSpatial( false, registry ); } @SubscribeEvent - void registerBlocks(RegistryEvent.Register event) + public void modelRegistryEvent ( ModelRegistryEvent event ) { - IForgeRegistry registry = event.getRegistry(); + final Api api = Api.INSTANCE; + final IPartHelper partHelper = api.partHelper(); + final IRegistryContainer registries = api.registries(); -// try { -// for ( Field f : Api.INSTANCE.definitions().blocks().getClass().getDeclaredFields() ) -// { -// f.setAccessible(true); -// if( f.getType() == IBlockDefinition.class || f.getType() == ITileDefinition.class ) { -// IBlockDefinition block = (IBlockDefinition) f.get(Api.INSTANCE.definitions().blocks()); -// Block b = block.maybeBlock().get(); -// System.out.println(b +" -> " + b.getRegistryName()); -// registry.register(b); -// } -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } + ApiDefinitions definitions = api.definitions(); + definitions.getRegistry().getBootstrapComponents().forEach( b -> b.modelLoader( FMLCommonHandler.instance().getEffectiveSide() ) ); + } + @SubscribeEvent + public void registerBlocks(RegistryEvent.Register event) + { + IForgeRegistry registry = event.getRegistry(); // TODO : 1.12 Improve for (Block b : blocksToRegister) { - System.out.println("Registering block : " + b + " -> " + b.getRegistryName()); registry.register( b ); } blocksToRegister = null; } @SubscribeEvent - void registerItems(RegistryEvent.Register event) { + public void registerItems(RegistryEvent.Register event) { IForgeRegistry registry = event.getRegistry(); // TODO : 1.12 Improve for( Item i : itemsToRegister ) { - System.out.println("Registering item : " + i + " -> " + i.getRegistryName()); registry.register( i ); } itemsToRegister = null; } @SubscribeEvent - void registerRecipes(RegistryEvent.Register event) + public void registerRecipes(RegistryEvent.Register event) { IForgeRegistry registry = event.getRegistry(); // TODO : 1.12 Improve