I'm using Forge 1.8-11.14.3.1502. From what I can see in the changelog, fluid rendering was added in build 1464. So I would expect this to work in my version.
I'm creating a fluid (GenericFluid) and a fluid block (GenericLiquid extends BlockFluidClassic) that uses that fluid in it's constructor. When I place my fluid, it behaves as expected, but renders with the default "not found" block (magenta/black squares). I've created a JSON file in the blockstates and models/block folders for my mod. But no matter what, I cannot get the textures to load. I am able to get all of my other blocks and items the show up properly, just not this fluid.
I've tried searching for days and have used up of all of the resources I found on Google. Does anybody know how to do this? I'll post the relevant code below for review.
===================GenericFluid.java=======================
package tutorial.generic;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
public class GenericFluid extends Fluid {
public static final String FLUID_NAME = "genericFluid";
public GenericFluid() {
super(FLUID_NAME, new ResourceLocation(Generic.MOD_ID + ":blocks/" + GenericLiquid.BLOCK_NAME + "_still"), new ResourceLocation(Generic.MOD_ID + ":blocks/" + GenericLiquid.BLOCK_NAME + "_flow"));
FluidRegistry.registerFluid(this);
this.setDensity(2000);
this.setTemperature(300);
this.setViscosity(2000);
this.setUnlocalizedName(Generic.MOD_ID + ":" + FLUID_NAME);
}
}
===================GenericLiquid.java=======================
package tutorial.generic;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import com.sun.javafx.sg.prism.NodeEffectInput.RenderType;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.texture.IIconCreator;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.resources.IResource;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.SimpleReloadableResourceManager;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fluids.BlockFluidClassic;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class GenericLiquid extends BlockFluidClassic {
public static final String BLOCK_NAME = "genericLiquid";
public GenericLiquid() {
super(Generic.GenericFluid, Material.water);
GameRegistry.registerBlock(this, BLOCK_NAME);
this.setUnlocalizedName(Generic.MOD_ID + ":" + BLOCK_NAME);
this.setCreativeTab(CreativeTabs.tabBlock);
}
@Override
public boolean canDisplace(IBlockAccess objAccess, BlockPos objPosition) {
IBlockState objState = objAccess.getBlockState(objPosition);
if (objState != null) {
if (objState.getBlock().getMaterial() == Material.water)
return true;
else if (objState.getBlock().getMaterial().isLiquid())
return false;
else
return super.canDisplace(objAccess, objPosition);
}
else
return true;
}
@Override
public boolean displaceIfPossible(World objWorld, BlockPos objPosition) {
IBlockState objState = objWorld.getBlockState(objPosition);
if (objState != null) {
if (objState.getBlock().getMaterial() == Material.water)
return true;
else if (objState.getBlock().getMaterial().isLiquid())
return false;
else
return super.displaceIfPossible(objWorld, objPosition);
}
else
return true;
}
}
===================Generic.java=======================
package tutorial.generic;
import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.block.statemap.StateMap;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.BlockFluidBase;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.*;
import net.minecraftforge.fml.common.event.*;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraft.client.renderer.block.statemap.StateMap;
@Mod(modid = Generic.MOD_ID, name = Generic.MOD_NAME, version = Generic.MOD_VERSION)
public class Generic {
public static final String MOD_ID = "tutorial";
public static final String MOD_NAME = "Generic Mod";
public static final String MOD_VERSION = "0.0.0";
@Instance(value = Generic.MOD_ID)
public static Generic instance;
public static Item GenericIngot, GenericNugget;
public static Block GenericOre, GenericLiquid;
public static Fluid GenericFluid;
public static final ModelResourceLocation GenericLiquidResourceLocation = new ModelResourceLocation(Generic.MOD_ID + ":" + tutorial.generic.GenericLiquid.BLOCK_NAME, "fluid");
@EventHandler
public void preInit(FMLPreInitializationEvent objEvent) {
//Create fluids
GenericFluid = new GenericFluid();
//Create blocks
//GenericOre = new GenericOre();
GenericLiquid = new GenericLiquid();
//Create items
//GenericNugget = new GenericNugget();
//GenericIngot = new GenericIngot();
//Allow for rendering of fluids? Not really sure what this is, but found the code snippet online.
Item objLiquid = Item.getItemFromBlock(Generic.GenericLiquid);
ModelBakery.addVariantName(objLiquid);
ModelLoader.setCustomMeshDefinition(objLiquid, new ItemMeshDefinition() {
public ModelResourceLocation getModelLocation(ItemStack objStack) {
return GenericLiquidResourceLocation;
}
});
ModelLoader.setCustomStateMapper(GenericLiquid, new StateMapperBase() {
public ModelResourceLocation getModelResourceLocation(IBlockState objState) {
return GenericLiquidResourceLocation;
}
});
}
@EventHandler
public void init(FMLInitializationEvent objEvent) {
//Add crafting recipies
//GameRegistry.addRecipe(new ItemStack(GenericIngot), new Object[] {"DDD", "DDD", "DDD", 'D', GenericNugget});
//Add rendering code
if(objEvent.getSide() == Side.CLIENT) {
RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
//renderItem.getItemModelMesher().register(GenericNugget, 0, new ModelResourceLocation(Generic.MOD_ID + ":" + tutorial.generic.GenericNugget.ITEM_NAME, "inventory"));
//renderItem.getItemModelMesher().register(GenericIngot, 0, new ModelResourceLocation(Generic.MOD_ID + ":" + tutorial.generic.GenericIngot.ITEM_NAME, "inventory"));
//renderItem.getItemModelMesher().register(Item.getItemFromBlock(GenericOre), 0, new ModelResourceLocation(Generic.MOD_ID + ":" + tutorial.generic.GenericOre.BLOCK_NAME, "inventory"));
renderItem.getItemModelMesher().register(Item.getItemFromBlock(GenericLiquid), 0, new ModelResourceLocation(Generic.MOD_ID + ":" + tutorial.generic.GenericLiquid.BLOCK_NAME, "inventory"));
//More online code, not sure what this achieves.
ModelLoader.setCustomStateMapper(GenericLiquid, (new StateMap.Builder()).addPropertiesToIgnore(BlockFluidBase.LEVEL).build());
}
}
}
================blockstates/genericLiquid.json====================
{
"variants": {
"normal": { "model": "tutorial:genericLiquid" }
}
}
================models/block/genericLiquid.json====================
{
"parent": "block/cube_all",
"textures": {
"all": "tutorial:blocks/genericLiquid_still",
"flowing": "tutorial:blocks/genericLiquid_flow"
}
}