Major Refactoring of Bootstrap Code (#75)

- Refactored boostrap code:
  * Completely reworked item/block/tile registration.
  * Fixed server side startup.
  * Fixed server side startup.
  * More documentation.
  * More heavy cleanup
  * More cleanups.
  * Major refactoring of state mapping and fixes a lot of other issue related to item rendering.
  * Fixes sky chest item models (no item TESR).
  * Only use CachingRotatingBakedModel for tile entities automatically.
  Fix default rotation of quartz pillar for item model.
  * Used method reference instead of lambda for ItemMeshDefinition for multiparts.
  * Removed unnecessary IHasSpecialItemModel
  * Removed unused IconReg class.
  * Updated resource pack version.
This commit is contained in:
shartte
2016-08-22 14:25:10 +02:00
committed by Sebastian Hartte
parent 66df324ef0
commit 6f2bbfab4c
172 changed files with 2289 additions and 2863 deletions
@@ -0,0 +1,29 @@
package appeng.bootstrap.components;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraftforge.fml.relauncher.Side;
public class BlockColorComponent implements InitComponent
{
private final Block block;
private final IBlockColor blockColor;
public BlockColorComponent( Block block, IBlockColor blockColor )
{
this.block = block;
this.blockColor = blockColor;
}
@Override
public void initialize( Side side )
{
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler( blockColor, block );
}
}
@@ -0,0 +1,16 @@
package appeng.bootstrap.components;
import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface
public interface InitComponent extends IBootstrapComponent
{
@Override
void initialize( Side side );
}
@@ -0,0 +1,28 @@
package appeng.bootstrap.components;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.color.IItemColor;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
public class ItemColorComponent implements InitComponent
{
private final Item item;
private final IItemColor itemColor;
public ItemColorComponent( Item item, IItemColor itemColor )
{
this.item = item;
this.itemColor = itemColor;
}
@Override
public void initialize( Side side )
{
Minecraft.getMinecraft().getItemColors().registerItemColorHandler( itemColor, item );
}
}
@@ -0,0 +1,34 @@
package appeng.bootstrap.components;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
/**
* Registers a custom item mesh definition that can be used to dynamically determine the item model based on
* item stack properties.
*/
public class ItemMeshDefinitionComponent implements InitComponent
{
private final Item item;
private final ItemMeshDefinition meshDefinition;
public ItemMeshDefinitionComponent( @Nonnull Item item, @Nonnull ItemMeshDefinition meshDefinition )
{
this.item = item;
this.meshDefinition = meshDefinition;
}
@Override
public void initialize( Side side )
{
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, meshDefinition );
}
}
@@ -0,0 +1,42 @@
package appeng.bootstrap.components;
import java.util.Map;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
/**
* Registers the models that should by used for an item, including the ability to
* distinguish by meta.
*/
public class ItemModelComponent implements InitComponent
{
private final Item item;
private final Map<Integer, ModelResourceLocation> modelsByMeta;
public ItemModelComponent( @Nonnull Item item, @Nonnull Map<Integer, ModelResourceLocation> modelsByMeta )
{
this.item = item;
this.modelsByMeta = modelsByMeta;
}
@Override
public void initialize( Side side )
{
ItemModelMesher itemMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher();
modelsByMeta.forEach( ( meta, model ) ->
{
itemMesher.register( item, meta, model );
} );
}
}
@@ -0,0 +1,33 @@
package appeng.bootstrap.components;
import java.util.Collection;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent;
public class ItemVariantsComponent implements IBootstrapComponent
{
private final Item item;
private final Collection<ResourceLocation> resources;
public ItemVariantsComponent( Item item, Collection<ResourceLocation> resources )
{
this.item = item;
this.resources = resources;
}
@Override
public void preInitialize( Side side )
{
ResourceLocation[] resourceArr = resources.toArray( new ResourceLocation[0] );
ModelBakery.registerItemVariants( item, resourceArr );
}
}
@@ -0,0 +1,65 @@
package appeng.bootstrap.components;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;
import com.google.common.collect.Sets;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.util.registry.IRegistry;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import appeng.core.AppEng;
public class ModelOverrideComponent implements PreInitComponent
{
// Maps from resource path to customizer
private final Map<String, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel>> customizer = new HashMap<>();
public void addOverride( String resourcePath, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
{
this.customizer.put( resourcePath, customizer );
}
@Override
public void preInitialize( Side side )
{
MinecraftForge.EVENT_BUS.register( this );
}
@SubscribeEvent
public void onModelBakeEvent( final ModelBakeEvent event )
{
IRegistry<ModelResourceLocation, IBakedModel> modelRegistry = event.getModelRegistry();
Set<ModelResourceLocation> keys = Sets.newHashSet( modelRegistry.getKeys() );
for( ModelResourceLocation location : keys )
{
if( !location.getResourceDomain().equals( AppEng.MOD_ID ) )
{
continue;
}
BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer = this.customizer.get( location.getResourcePath() );
if( customizer != null )
{
IBakedModel orgModel = modelRegistry.getObject( location );
IBakedModel newModel = customizer.apply( location, orgModel );
if( newModel != orgModel )
{
modelRegistry.putObject( location, newModel );
}
}
}
}
}
@@ -0,0 +1,15 @@
package appeng.bootstrap.components;
import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface
public interface PostInitComponent extends IBootstrapComponent
{
@Override
void postInitialize( Side side );
}
@@ -0,0 +1,15 @@
package appeng.bootstrap.components;
import net.minecraftforge.fml.relauncher.Side;
import appeng.bootstrap.IBootstrapComponent;
@FunctionalInterface
public interface PreInitComponent extends IBootstrapComponent
{
@Override
void preInitialize( Side side );
}
@@ -0,0 +1,38 @@
package appeng.bootstrap.components;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.relauncher.Side;
/**
* Registers a custom state mapper for a given block.
*/
public class StateMapperComponent implements InitComponent
{
private final Block block;
private final IStateMapper stateMapper;
public StateMapperComponent( Block block, IStateMapper stateMapper )
{
this.block = block;
this.stateMapper = stateMapper;
}
@Override
public void initialize( Side side )
{
ModelLoader.setCustomStateMapper( block, stateMapper );
if( stateMapper instanceof IResourceManagerReloadListener )
{
( (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager() ).registerReloadListener( (IResourceManagerReloadListener) stateMapper );
}
}
}
@@ -0,0 +1,34 @@
package appeng.bootstrap.components;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.relauncher.Side;
import appeng.tile.AEBaseTile;
/**
* Registers a TESR for a given tile entity class.
*
* @param <T>
*/
public class TesrComponent<T extends AEBaseTile> implements PreInitComponent
{
private final Class<T> tileEntityClass;
private final TileEntitySpecialRenderer<? super T> tesr;
public TesrComponent( Class<T> tileEntityClass, TileEntitySpecialRenderer<? super T> tesr )
{
this.tileEntityClass = tileEntityClass;
this.tesr = tesr;
}
@Override
public void preInitialize( Side side )
{
ClientRegistry.bindTileEntitySpecialRenderer( tileEntityClass, tesr );
}
}