package me.km; import java.awt.Color; import java.lang.reflect.Field; import me.km.blocks.ModBlocks; import me.km.blocks.cauldron.TileEntityCauldron; import me.km.entities.ModEntities; import me.km.items.ItemColoredSoup; import me.km.items.ItemJewel; import me.km.items.ModItems; import me.km.items.ModelCylinder; import me.km.items.ModelHat; import me.km.networking.KeyManager; import me.km.utils.ReflectionUtils; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.resources.FoliageColorReloadListener; import net.minecraft.client.resources.GrassColorReloadListener; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ColorizerFoliage; import net.minecraft.world.IBlockAccess; import net.minecraft.world.biome.BiomeColorHelper; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class ClientProxy extends CommonProxy { @Override public void registerItemRenderer(Item item, int meta, String id, String variant) { ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(KajetansMod.MODID + ":" + id, variant)); } @Override public void registerItemRenderer(Item item, int meta, String id) { registerItemRenderer(item, meta, id, null); } @Override public void registerFluidModel(IFluidBlock fluidBlock) { final Item item = Item.getItemFromBlock((Block) fluidBlock); assert item != null; ModelBakery.registerItemVariants(item); ModelResourceLocation modelResourceLocation = new ModelResourceLocation(KajetansMod.MODID + ":fluids", fluidBlock.getFluid().getName()); ModelLoader.setCustomMeshDefinition(item, MeshDefinitionFix.create(stack -> modelResourceLocation)); ModelLoader.setCustomStateMapper((Block) fluidBlock, new StateMapperBase() { @Override protected ModelResourceLocation getModelResourceLocation(IBlockState state) { return modelResourceLocation; } }); } @Override public void registerEntityRenderer(Class c, Render r) { RenderingRegistry.registerEntityRenderingHandler(c, r); } @Override public void init() { ModEntities.initClient(); MinecraftForge.EVENT_BUS.register(new ClientEvents()); MinecraftForge.EVENT_BUS.register(new KeyManager()); BlockColors bColors = Minecraft.getMinecraft().getBlockColors(); bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) -> { TileEntityCauldron tile = (TileEntityCauldron) w.getTileEntity(pos); if(tile == null) { return -16777216; } Color c = tile.getColor(); return -16777216 | c.getRed() << 16 | c.getGreen() << 8 | c.getBlue(); }, ModBlocks.cauldronOak, ModBlocks.cauldronAcacia, ModBlocks.cauldronBigOak, ModBlocks.cauldronBirch, ModBlocks.cauldronJungle, ModBlocks.cauldronSpruce); bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int ti) -> 0xFFD4F7, ModBlocks.redCrystalLeaves); bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int ti) -> 0xD0FFFF, ModBlocks.blueCrystalLeaves); bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int ti) -> 0xFFFFFF, ModBlocks.whiteCrystalLeaves); bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int ti) -> w != null && pos != null ? BiomeColorHelper.getFoliageColorAtPos(w, pos) : ColorizerFoliage.getFoliageColorBasic(), Blocks.LEAVES, ModBlocks.apricotLeaves, ModBlocks.pearLeaves, ModBlocks.plumLeaves); ItemColors iColors = Minecraft.getMinecraft().getItemColors(); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> tintIndex > 0 ? -1 : ((ItemColoredSoup) stack.getItem()).getColor(stack), ModItems.coloredSoup); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> tintIndex > 0 ? -1 : ((ItemJewel) stack.getItem()).getColor(stack), ModItems.jewel); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> { IBlockState iblockstate = ((ItemBlock) stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata()); return bColors.colorMultiplier(iblockstate, null, null, tintIndex); }, ModBlocks.apricotLeaves, ModBlocks.pearLeaves, ModBlocks.plumLeaves); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> 0xFFD4F7, Item.getItemFromBlock(ModBlocks.redCrystalLeaves)); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> 0xD0FFFF, Item.getItemFromBlock(ModBlocks.blueCrystalLeaves)); iColors.registerItemColorHandler((ItemStack stack, int tintIndex) -> 0xFFFFFF, Item.getItemFromBlock(ModBlocks.whiteCrystalLeaves)); } @SideOnly(Side.CLIENT) private final static ModelHat STRAW_HAT = new ModelHat(1); @SideOnly(Side.CLIENT) private final static ModelCylinder CYLINDER = new ModelCylinder(1); @Override public ModelBiped getCylinderModel() { return CYLINDER; } @Override public ModelBiped getStrawHatModel() { return STRAW_HAT; } // ------------------------------------------------------------------------- // rendering stuff // ------------------------------------------------------------------------- @SideOnly(Side.CLIENT) private final static Field LOC_FOLIAGE_PNG = ReflectionUtils.getFinalStaticField(FoliageColorReloadListener.class, "field_130079_a", "LOC_FOLIAGE_PNG"); @Override public void setFoliage(ResourceLocation loc) { ReflectionUtils.setFieldValue(null, LOC_FOLIAGE_PNG, loc); } @SideOnly(Side.CLIENT) private final static Field LOC_GRASS_PNG = ReflectionUtils.getFinalStaticField(GrassColorReloadListener.class, "field_130078_a", "LOC_GRASS_PNG"); @Override public void setGrass(ResourceLocation loc) { ReflectionUtils.setFieldValue(null, LOC_GRASS_PNG, loc); } }