diff --git a/src/java/mmm/materials/MLeaves.java b/src/java/mmm/materials/MLeaves.java index e039854..85eb16e 100644 --- a/src/java/mmm/materials/MLeaves.java +++ b/src/java/mmm/materials/MLeaves.java @@ -5,6 +5,8 @@ import java.util.Arrays; import java.util.List; import java.util.Random; +import mmm.utils.I_UTintedBlock; +import mmm.utils.I_UTintedItem; import mmm.utils.URegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; @@ -12,6 +14,8 @@ import net.minecraft.block.BlockPlanks; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -19,8 +23,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ColorizerFoliage; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeColorHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -28,6 +34,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; public class MLeaves extends BlockLeaves + implements I_UTintedBlock , I_UTintedItem { private final MWood wood; @@ -153,4 +160,42 @@ public class MLeaves return Blocks.LEAVES.shouldSideBeRendered( state , world , pos , side ); } + + @Override + @SideOnly( Side.CLIENT ) + public IBlockColor getBlockTint( ) + { + return new IBlockColor( ) { + + @Override + public int colorMultiplier( final IBlockState state , final IBlockAccess worldIn , final BlockPos pos , + final int tintIndex ) + { + final boolean inWorld = worldIn != null && pos != null; + final int baseTint = inWorld + ? BiomeColorHelper.getFoliageColorAtPos( worldIn , pos ) + : ColorizerFoliage.getFoliageColorBasic( ); + return baseTint; + } + }; + } + + + @Override + @SideOnly( Side.CLIENT ) + public IItemColor getItemTint( ) + { + final IBlockColor bTint = this.getBlockTint( ); + final IBlockState ds = this.getDefaultState( ); + return new IItemColor( ) { + + @Override + public int getColorFromItemstack( final ItemStack stack , final int tintIndex ) + { + return bTint.colorMultiplier( ds , null , null , tintIndex ); + } + + }; + } + } diff --git a/src/java/mmm/proxy/PClient.java b/src/java/mmm/proxy/PClient.java index 3b13bc2..47364ed 100644 --- a/src/java/mmm/proxy/PClient.java +++ b/src/java/mmm/proxy/PClient.java @@ -2,6 +2,7 @@ package mmm.proxy; import mmm.utils.URegistry; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -14,7 +15,15 @@ public class PClient public void preInit( final FMLPreInitializationEvent event ) { super.preInit( event ); - URegistry.setupItemModels( ); + URegistry.preInitClient( ); + } + + + @Override + public void init( FMLInitializationEvent event ) + { + super.init( event ); + URegistry.initClient( ); } } \ No newline at end of file diff --git a/src/java/mmm/utils/I_UTintedBlock.java b/src/java/mmm/utils/I_UTintedBlock.java new file mode 100644 index 0000000..7d1c254 --- /dev/null +++ b/src/java/mmm/utils/I_UTintedBlock.java @@ -0,0 +1,17 @@ +package mmm.utils; + + +import net.minecraft.client.renderer.color.IBlockColor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + + +/** For blocks that need to register a tint */ +public interface I_UTintedBlock +{ + + @SideOnly( Side.CLIENT ) + public IBlockColor getBlockTint( ); + +} diff --git a/src/java/mmm/utils/I_UTintedItem.java b/src/java/mmm/utils/I_UTintedItem.java new file mode 100644 index 0000000..10473be --- /dev/null +++ b/src/java/mmm/utils/I_UTintedItem.java @@ -0,0 +1,20 @@ +package mmm.utils; + + +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + + +/** + * For items that need to register a tint, or blocks with automatically registered items that need + * to be tinted. + */ +public interface I_UTintedItem +{ + + @SideOnly( Side.CLIENT ) + public IItemColor getItemTint( ); + +} diff --git a/src/java/mmm/utils/URegistry.java b/src/java/mmm/utils/URegistry.java index 61b47f1..02a1c47 100644 --- a/src/java/mmm/utils/URegistry.java +++ b/src/java/mmm/utils/URegistry.java @@ -1,6 +1,7 @@ package mmm.utils; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -9,7 +10,10 @@ import java.util.Map; import mmm.Mmm; import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.color.BlockColors; +import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemCloth; @@ -19,6 +23,8 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.common.IFuelHandler; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.common.registry.IForgeRegistryEntry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import scala.actors.threadpool.Arrays; @@ -51,6 +57,10 @@ public class URegistry private static final HashMap< Item , Boolean > ITEMS = new HashMap< Item , Boolean >( ); private static final HashSet< Block > BLOCKS = new HashSet< Block >( ); + private static final ArrayList< Block > TINTED_BLOCKS = new ArrayList<>( ); + private static final ArrayList< Block > TINTED_BLOCK_ITEMS = new ArrayList<>( ); + private static final ArrayList< Item > TINTED_ITEMS = new ArrayList<>( ); + private static final HashMap< Item , Object > FUELS = new HashMap<>( ); private static final FuelHandler FUEL_HANDLER = new FuelHandler( ); @@ -98,9 +108,13 @@ public class URegistry public static void addItem( final Item item , final boolean registerModel ) { - GameRegistry.register( item ); - URegistry.ITEMS.put( item , registerModel ); - URegistry.addRecipeRegistrar( item ); + if ( URegistry.ITEMS.put( item , registerModel ) == null ) { + GameRegistry.register( item ); + if ( item instanceof I_UTintedItem ) { + URegistry.TINTED_ITEMS.add( item ); + } + URegistry.addRecipeRegistrar( item ); + } } @@ -131,13 +145,21 @@ public class URegistry public static void addBlock( final Block block , final Item blockItem , final boolean registerItemModel ) { - GameRegistry.register( block ); - URegistry.BLOCKS.add( block ); - URegistry.addRecipeRegistrar( block ); - URegistry.addOreGenerationRegistrar( block ); + if ( URegistry.BLOCKS.add( block ) ) { + GameRegistry.register( block ); + if ( block instanceof I_UTintedBlock ) { + URegistry.TINTED_BLOCKS.add( block ); + } + if ( block instanceof I_UTintedItem ) { + URegistry.TINTED_BLOCK_ITEMS.add( block ); + } - if ( blockItem != null ) { - URegistry.addItem( blockItem , registerItemModel ); + URegistry.addRecipeRegistrar( block ); + URegistry.addOreGenerationRegistrar( block ); + + if ( blockItem != null ) { + URegistry.addItem( blockItem , registerItemModel ); + } } } @@ -202,8 +224,10 @@ public class URegistry } - public static void setupItemModels( ) + @SideOnly( Side.CLIENT ) + public static void preInitClient( ) { + // Register item models for ( final Map.Entry< Item , Boolean > entry : URegistry.ITEMS.entrySet( ) ) { if ( !entry.getValue( ) ) { continue; @@ -218,4 +242,27 @@ public class URegistry ModelLoader.setCustomModelResourceLocation( item , 0 , location ); } } + + + @SideOnly( Side.CLIENT ) + public static void initClient( ) + { + final BlockColors blockColors = Minecraft.getMinecraft( ).getBlockColors( ); + final ItemColors itemColors = Minecraft.getMinecraft( ).getItemColors( ); + + // Register tinted blocks + for ( final Block tintedBlock : URegistry.TINTED_BLOCKS ) { + blockColors.registerBlockColorHandler( ( (I_UTintedBlock) tintedBlock ).getBlockTint( ) , tintedBlock ); + } + + // Register tinted block items + for ( final Block tintedBlock : URegistry.TINTED_BLOCK_ITEMS ) { + itemColors.registerItemColorHandler( ( (I_UTintedItem) tintedBlock ).getItemTint( ) , tintedBlock ); + } + + // Register tinted items + for ( final Item tintedItem : URegistry.TINTED_ITEMS ) { + itemColors.registerItemColorHandler( ( (I_UTintedItem) tintedItem ).getItemTint( ) , tintedItem ); + } + } }