From 60f2ee807be0831e4429150d7905de57fb3c80e3 Mon Sep 17 00:00:00 2001 From: Adubbz Date: Thu, 17 Mar 2016 10:22:02 +1100 Subject: [PATCH] Fixed block colouring in the world --- .../common/block/BlockBOPDecoration.java | 2 +- .../common/block/BlockBOPDoublePlant.java | 51 +++++++++---- .../common/block/BlockBOPGrass.java | 3 +- .../common/block/BlockBOPLeaves.java | 71 +++++++++++++------ .../common/block/BlockBOPPlant.java | 60 +++++++++++----- .../common/block/BlockBOPVine.java | 5 +- .../biomesoplenty/common/init/ModBlocks.java | 10 +++ .../models/block/flax_lower.json | 2 +- 8 files changed, 149 insertions(+), 55 deletions(-) diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPDecoration.java b/src/main/java/biomesoplenty/common/block/BlockBOPDecoration.java index fe4d4e609..3ae487409 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPDecoration.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPDecoration.java @@ -44,7 +44,7 @@ public class BlockBOPDecoration extends Block implements IBOPBlock @Override public String getStateName(IBlockState state) {return "";} @Override - public IBlockColor getColourHandler() { return ModBlocks.FOLIAGE_COLOURING; } + public IBlockColor getColourHandler() { return null; } // constructor public BlockBOPDecoration() { diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPDoublePlant.java b/src/main/java/biomesoplenty/common/block/BlockBOPDoublePlant.java index 7011f8a77..48ce088db 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPDoublePlant.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPDoublePlant.java @@ -20,6 +20,7 @@ import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -71,8 +72,41 @@ public class BlockBOPDoublePlant extends BlockBOPDoubleDecoration implements ISh { return ((DoublePlantType) state.getValue(VARIANT)).getName(); } - - + + public enum ColoringType {PLAIN, LIKE_LEAVES, LIKE_GRASS}; + + public static ColoringType getColoringType(DoublePlantType plant) + { + switch (plant) + { + case FLAX: + return ColoringType.LIKE_GRASS; + default: + return ColoringType.PLAIN; + } + } + + public IBlockColor getColourHandler() + { + return new IBlockColor() + { + @Override + public int colorMultiplier(IBlockState state, IBlockAccess world, BlockPos pos, int tintIndex) + { + if ( world != null && pos != null) + { + switch (getColoringType((DoublePlantType) state.getValue(VARIANT))) + { + case LIKE_GRASS: + return BiomeColorHelper.getGrassColorAtPos(world, pos); + } + } + + return ColorizerFoliage.getFoliageColorBasic(); + } + }; + } + public BlockBOPDoublePlant() { super(); @@ -93,18 +127,7 @@ public class BlockBOPDoublePlant extends BlockBOPDoubleDecoration implements ISh - public enum ColoringType {PLAIN, LIKE_LEAVES, LIKE_GRASS}; - - public static ColoringType getColoringType(DoublePlantType plant) - { - switch (plant) - { - case FLAX: - return ColoringType.LIKE_GRASS; - default: - return ColoringType.PLAIN; - } - } + /* // different variants have different sizes diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java b/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java index 118d08356..52dcec63b 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java @@ -13,6 +13,7 @@ import java.util.Random; import biomesoplenty.api.block.BOPBlocks; import biomesoplenty.api.block.IBOPBlock; import biomesoplenty.api.block.ISustainsPlantType; +import biomesoplenty.common.init.ModBlocks; import biomesoplenty.common.item.ItemBOPBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockDirt; @@ -86,7 +87,7 @@ public class BlockBOPGrass extends BlockGrass implements IBOPBlock, ISustainsPla } } @Override - public IBlockColor getColourHandler() { return null; } + public IBlockColor getColourHandler() { return ModBlocks.GRASS_COLORING; } public BlockBOPGrass() { diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPLeaves.java b/src/main/java/biomesoplenty/common/block/BlockBOPLeaves.java index 790aec7bb..f3f27321f 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPLeaves.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPLeaves.java @@ -13,6 +13,7 @@ import java.util.Random; import biomesoplenty.api.block.IBOPBlock; import biomesoplenty.api.item.BOPItems; +import biomesoplenty.common.enums.BOPPlants; import biomesoplenty.common.enums.BOPTrees; import biomesoplenty.common.item.ItemBOPBlock; import biomesoplenty.common.util.block.VariantPagingHelper; @@ -99,8 +100,48 @@ public class BlockBOPLeaves extends BlockLeaves implements IBOPBlock return tree.getName() + "_leaves"; } } + + public enum ColoringType {PLAIN, TINTED, OVERLAY}; + + public static ColoringType getColoringType(BOPTrees tree) + { + switch (tree) + { + case BAMBOO: case UMBRAN: case DEAD: case ETHEREAL: case FIR: case HELLBARK: case JACARANDA: case MAGIC: case MAPLE: case ORANGE_AUTUMN: case ORIGIN: case PINK_CHERRY: case WHITE_CHERRY: case YELLOW_AUTUMN: case RED_BIG_FLOWER: case YELLOW_BIG_FLOWER: + return ColoringType.PLAIN; + case FLOWERING: + return ColoringType.OVERLAY; + case MAHOGANY: case MANGROVE: case PALM: case PINE: case REDWOOD: case SACRED_OAK: case WILLOW: case EBONY: case EUCALYPTUS: default: + return ColoringType.TINTED; + } + } + @Override - public IBlockColor getColourHandler() { return null; } + public IBlockColor getColourHandler() + { + final IProperty variantProp = this.variantProperty; + + return new IBlockColor() + { + @Override + public int colorMultiplier(IBlockState state, IBlockAccess world, BlockPos pos, int tintIndex) + { + if ( world != null && pos != null) + { + switch (getColoringType((BOPTrees) state.getValue(variantProp))) + { + case TINTED: + return BiomeColorHelper.getFoliageColorAtPos(world, pos); + case OVERLAY: + if (tintIndex == 0) + return BiomeColorHelper.getFoliageColorAtPos(world, pos); + } + } + + return 0xFFFFFF; + } + }; + } private BlockBOPLeaves() { @@ -134,22 +175,6 @@ public class BlockBOPLeaves extends BlockLeaves implements IBOPBlock return meta; } - - public enum ColoringType {PLAIN, TINTED, OVERLAY}; - - public static ColoringType getColoringType(BOPTrees tree) - { - switch (tree) - { - case BAMBOO: case UMBRAN: case DEAD: case ETHEREAL: case FIR: case HELLBARK: case JACARANDA: case MAGIC: case MAPLE: case ORANGE_AUTUMN: case ORIGIN: case PINK_CHERRY: case WHITE_CHERRY: case YELLOW_AUTUMN: case RED_BIG_FLOWER: case YELLOW_BIG_FLOWER: - return ColoringType.PLAIN; - case FLOWERING: - return ColoringType.OVERLAY; - case MAHOGANY: case MANGROVE: case PALM: case PINE: case REDWOOD: case SACRED_OAK: case WILLOW: case EBONY: case EUCALYPTUS: default: - return ColoringType.TINTED; - } - } - // blocks that are not placed during generation should not decay @Override public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) @@ -359,7 +384,7 @@ public class BlockBOPLeaves extends BlockLeaves implements IBOPBlock } - //The fields used by getBlockLayer() and isOpaqueCube() are set externally for Blocks.leaves *specifically*. As a result, we do not inherit + //The fields used by getBlockLayer(), isOpaqueCube() and shouldSideBeRendered are set externally for Blocks.leaves *specifically*. As a result, we do not inherit //it simply be extending BlockLeaves. @Override @SideOnly(Side.CLIENT) @@ -373,8 +398,14 @@ public class BlockBOPLeaves extends BlockLeaves implements IBOPBlock { return Blocks.leaves.isOpaqueCube(state); } - - + + @SideOnly(Side.CLIENT) + @Override + public boolean shouldSideBeRendered(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) + { + return Blocks.leaves.shouldSideBeRendered(state, world, pos, side); + } + // We are forced to implement the method below in order to extend the BlockLeaves abstract class // ...however, we don't actually use it anywhere so it's safe to just return null // it makes no sense in our context diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java b/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java index d03e773fa..ec2060f70 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java @@ -20,6 +20,7 @@ import net.minecraft.block.Block; 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.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; @@ -107,6 +108,48 @@ public class BlockBOPPlant extends BlockBOPDecoration implements IShearable return plant.getName(); } } + + public enum ColoringType {PLAIN, LIKE_LEAVES, LIKE_GRASS}; + + public static ColoringType getColoringType(BOPPlants plant) + { + switch (plant) + { + case SHRUB: case LEAFPILE: case POISONIVY: case BUSH: case BERRYBUSH: + return ColoringType.LIKE_LEAVES; + case SHORTGRASS: case MEDIUMGRASS: case SPROUT: case KORU: case CLOVERPATCH: case WHEATGRASS: case DAMPGRASS: + return ColoringType.LIKE_GRASS; + default: + return ColoringType.PLAIN; + } + } + + @Override + public IBlockColor getColourHandler() + { + final IProperty variantProp = this.variantProperty; + + return new IBlockColor() + { + @Override + public int colorMultiplier(IBlockState state, IBlockAccess world, BlockPos pos, int tintIndex) + { + if ( world != null && pos != null) + { + switch (getColoringType((BOPPlants) state.getValue(variantProp))) + { + case LIKE_LEAVES: + return BiomeColorHelper.getFoliageColorAtPos(world, pos); + + case LIKE_GRASS: + return BiomeColorHelper.getGrassColorAtPos(world, pos); + } + } + + return ColorizerFoliage.getFoliageColorBasic(); + } + }; + } private BlockBOPPlant() { @@ -262,23 +305,6 @@ public class BlockBOPPlant extends BlockBOPDecoration implements IShearable return false; } - - - public enum ColoringType {PLAIN, LIKE_LEAVES, LIKE_GRASS}; - - public static ColoringType getColoringType(BOPPlants plant) - { - switch (plant) - { - case SHRUB: case LEAFPILE: case POISONIVY: case BUSH: case BERRYBUSH: - return ColoringType.LIKE_LEAVES; - case SHORTGRASS: case MEDIUMGRASS: case SPROUT: case KORU: case CLOVERPATCH: case WHEATGRASS: case DAMPGRASS: - return ColoringType.LIKE_GRASS; - default: - return ColoringType.PLAIN; - } - } - // different variants have different sizes /* @Override public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPVine.java b/src/main/java/biomesoplenty/common/block/BlockBOPVine.java index 62a2dcaf8..a4b2caf36 100644 --- a/src/main/java/biomesoplenty/common/block/BlockBOPVine.java +++ b/src/main/java/biomesoplenty/common/block/BlockBOPVine.java @@ -9,6 +9,7 @@ package biomesoplenty.common.block; import biomesoplenty.api.block.IBOPBlock; +import biomesoplenty.common.init.ModBlocks; import biomesoplenty.common.item.ItemBOPBlock; import net.minecraft.block.BlockVine; import net.minecraft.block.SoundType; @@ -19,7 +20,9 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ColorizerGrass; import net.minecraft.world.IBlockAccess; +import net.minecraft.world.biome.BiomeColorHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -36,7 +39,7 @@ public class BlockBOPVine extends BlockVine implements IBOPBlock @Override public String getStateName(IBlockState state) {return "";} @Override - public IBlockColor getColourHandler() { return null; } + public IBlockColor getColourHandler() { return useGreyScaleTextures ? ModBlocks.FOLIAGE_COLOURING : null; } // if set to true, (the default), use BlockVine getBlockColor(), getRenderColor() and colorMultiplier() functions to color the texture based on biome // if set to false, use 0xFFFFFF for all the color functions so that the texture is used as it is diff --git a/src/main/java/biomesoplenty/common/init/ModBlocks.java b/src/main/java/biomesoplenty/common/init/ModBlocks.java index 65e1b10ad..8b216de88 100644 --- a/src/main/java/biomesoplenty/common/init/ModBlocks.java +++ b/src/main/java/biomesoplenty/common/init/ModBlocks.java @@ -87,6 +87,7 @@ import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemSlab; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ColorizerFoliage; +import net.minecraft.world.ColorizerGrass; import net.minecraft.world.IBlockAccess; import net.minecraft.world.biome.BiomeColorHelper; import net.minecraftforge.common.EnumPlantType; @@ -106,6 +107,15 @@ public class ModBlocks } }; + public static final IBlockColor GRASS_COLORING = new IBlockColor() + { + @Override + public int colorMultiplier(IBlockState state, IBlockAccess world, BlockPos pos, int tintIndex) + { + return world != null && pos != null ? BiomeColorHelper.getGrassColorAtPos(world, pos) : ColorizerGrass.getGrassColor(0.5D, 1.0D); + } + }; + // TODO: use getDrops() in classes where the drops are very specific, instead of implementing all 3 of quantityDropped() getItemDropped() and damageDropped() // TODO: docblocks! // TODO: make better use of canSustainPlant() in BlockDecoration and children diff --git a/src/main/resources/assets/biomesoplenty/models/block/flax_lower.json b/src/main/resources/assets/biomesoplenty/models/block/flax_lower.json index 3d976e09c..135a7d58a 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/flax_lower.json +++ b/src/main/resources/assets/biomesoplenty/models/block/flax_lower.json @@ -1,5 +1,5 @@ { - "parent": "block/tallgrass", + "parent": "block/tinted_cross", "textures": { "cross": "biomesoplenty:blocks/flax_lower" }