Jump to content

Fluid Rendering not Working


Breeper

Recommended Posts

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"
    }
}

 

Link to comment
Share on other sites

I explained a lot of the new fluid model system (including example code) in this thread recently. Post #5 explains the fluid initialisation and registration, post #19 explains the model registration.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.