I am creating a mod with an block Sail it is rendered with a TE using a model i created in Techne, the block uses all 16 metadata states for colors, i have been able to get the colors to work while it a block and all the names display correctly, however i cant get the icon to work properly. I briefly attempted to render the TE in inventory rather than a 2D icon however i could get that to work either, I don't really care which one we get working just so long as it works.
My fourm post on MC fourms pictures and a download can be found there if u need them
http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/2384775
[glow=purple,2,300]Registry[/glow] for GameRegistry.registerBlock() etc
package ships.addon.baseclass;
import ships.addon.blocks_items.BlockMast;
import ships.addon.blocks_items.BlockSail;
import ships.addon.blocks_items.ItemSail;
import ships.addon.blocks_items.TestItem;
import ships.addon.blocks_items.TEmast;
import ships.addon.blocks_items.TEsail;
import net.minecraft.item.Item;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
public class Registry {
public static Item TestItem;
public static void initItems(){
TestItem = new TestItem(); GameRegistry.registerItem(TestItem, "test");
}
public static Block Sail;
public static Item sail;
public static Block Mast;
//private static PropulsionDiscoverer TEsailDiscoverer;
public static void initBlocks(){
Sail = new BlockSail(Material.cloth);
sail = new ItemSail(Sail);
GameRegistry.registerBlock(Sail,ItemSail.class ,Sail.getUnlocalizedName().substring(5));
GameRegistry.registerTileEntity(TEsail.class, "sailTile");
//MinecraftForgeClient.registerItemRenderer(Registry.sail, new ItemSailRenderer());
//PropulsionDiscovererRegistry.addDiscoverer(TEsailDiscoverer);
Mast = new BlockMast(Material.wood);
GameRegistry.registerBlock(Mast, "mast");
GameRegistry.registerTileEntity(TEmast.class, "mastTile");
}
}
[glow=blue,2,300]Block[/glow]
package ships.addon.blocks_items;
import java.util.List;
import org.lwjgl.input.Keyboard;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ships.addon.baseclass.Registry;
import ships.addon.models.SailModel;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemDye;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
public class BlockSail extends Block implements ITileEntityProvider{
@SideOnly(Side.CLIENT)
private IIcon[] texture = new IIcon[16];
final static String[] subBlocks = new String[]{"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"};
public BlockSail(Material material){
super(material);
this.isBlockContainer = false;
this.setBlockName("sail");
this.setCreativeTab(CreativeTabs.tabTransport);
this.setHardness(0.5F);
this.setBlockTextureName("sailsaddon"+":"+(this.getUnlocalizedName().substring(5)));
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta){
return texture[meta % subBlocks.length];
}
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs ct, List list){
for (int i = 0; i < subBlocks.length; ++i){
list.add(new ItemStack(item, 1, i));
}
}
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register)
{
for (int i = 0; i < subBlocks.length; ++i){
texture[i] = register.registerIcon("sailsaddon"+":"+"sail_"+ subBlocks[~i&15]);
}
}
public void setBlockBoundsForItemRender(){
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
public int getRenderType(){
return -1;
}
public boolean isOpaqueCube(){
return false;
}
public int damageDropped(int meta){
return meta;
}
public boolean renderAsNormalBlock(){
return false;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
updateSail(world,x,y,z,(EntityPlayer)player);
}
//Determine the correct rotation for block
public void updateSail(World world, int x, int y, int z, EntityPlayer player){
if (!world.isRemote && world.getTileEntity(x,y,z) != null && world.getTileEntity(x,y,z) instanceof TEsail) {
byte Direction = 0;
int dir = MathHelper.floor_double((double)((player.rotationYaw * 4F) / 360F) + 0.5D) & 3;
if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)){dir = dir+1;}
if(dir==0||dir==2||dir==4){Direction = 1; TileEntity blk;
//---- check Below ----\\
blk = loc(world,x,y-1,z-1); // Z - Below
if(blk!=null&&blk instanceof TEsail){Direction = 5;
((TEsail) blk).setValue((byte)9);world.markBlockForUpdate(x, y-1, z-1);}
else if(blk!=null&& blk instanceof TEmast){Direction = 5;
((TEmast)blk).setValue((byte)9);world.markBlockForUpdate(x, y-1, z-1);}
blk = loc(world,x,y-1,z+1); // Z + Below
if(blk!=null&& blk instanceof TEsail){Direction = 3;
((TEsail)blk).setValue((byte)7);world.markBlockForUpdate(x, y-1, z+1);}
else if(blk!=null&& blk instanceof TEmast){Direction = 3;
((TEmast)blk).setValue((byte)7);world.markBlockForUpdate(x, y-1, z+1);}
//---- check Above ----\\
blk = loc(world,x,y+1,z-1); // Z - Above
if(blk!=null&& blk instanceof TEsail){Direction = 7;
((TEsail)blk).setValue((byte)3);world.markBlockForUpdate(x,y+1,z-1);}
else if(blk!=null&& blk instanceof TEmast){Direction = 7;
((TEmast)blk).setValue((byte)3);world.markBlockForUpdate(x,y+1,z-1);}
blk = loc(world,x,y+1,z+1); // Z + Above
if(blk!=null&&blk instanceof TEsail){Direction = 9;
((TEsail)blk).setValue((byte)5);world.markBlockForUpdate(x,y+1,z+1);}
else if(blk!=null&&blk instanceof TEmast){Direction = 9;
((TEmast)blk).setValue((byte)5);world.markBlockForUpdate(x,y+1,z+1);}
}
else{Direction = 0; TileEntity blk;
//---- check Below ----\\
blk = loc(world,x-1,y-1,z); // X - Below
if(blk!=null&&blk instanceof TEsail){Direction = 2;
((TEsail) blk).setValue((byte)6);world.markBlockForUpdate(x-1, y-1, z);}
else if(blk!=null&& blk instanceof TEmast){Direction = 2;
((TEmast)blk).setValue((byte)6);world.markBlockForUpdate(x-1, y-1, z);}
blk = loc(world,x+1,y-1,z); // X + Below
if(blk!=null&& blk instanceof TEsail){Direction = 4;
((TEsail)blk).setValue((byte);world.markBlockForUpdate(x+1, y-1, z);}
else if(blk!=null&& blk instanceof TEmast){Direction = 4;
((TEmast)blk).setValue((byte);world.markBlockForUpdate(x+1, y-1, z);}
//---- check Above ----\\
blk = loc(world,x-1,y+1,z); // X - Above
if(blk!=null&& blk instanceof TEsail){Direction = 8;
((TEsail)blk).setValue((byte)4);world.markBlockForUpdate(x-1,y+1,z);}
else if(blk!=null&& blk instanceof TEmast){Direction = 8;
((TEmast)blk).setValue((byte)4);world.markBlockForUpdate(x-1,y+1,z);}
blk = loc(world,x+1,y+1,z); // X + Above
if(blk!=null&&blk instanceof TEsail){Direction = 6;
((TEsail)blk).setValue((byte)2);world.markBlockForUpdate(x+1,y+1,z);}
else if(blk!=null&&blk instanceof TEmast){Direction = 6;
((TEmast)blk).setValue((byte)2);world.markBlockForUpdate(x+1,y+1,z);}
}
TileEntity tileloc = world.getTileEntity(x, y, z);
if (tileloc != null && tileloc instanceof TEsail)
{
((TEsail)tileloc).setValue(Direction);
world.markBlockForUpdate(x, y, z);
}
}
}
private TileEntity loc(World world,int x, int y, int z) {
return world.getTileEntity(x, y, z);
}
/**---- Block Bounding Box ----**/
public void setBlockBoundsBasedOnState(IBlockAccess block, int x, int y, int z)
{
byte Direction = 0;
Direction = (byte)((TEsail) block.getTileEntity(x,y,z)).getValue();
if (Direction==0){ //---- X X X X
this.setBlockBounds(0.4375F, 0.0F, 0.0F, 0.5625F, 1.0F, 1.0F);
}
else if (Direction==1){// Z Z Z Z
this.setBlockBounds(0.0F, 0.0F, 0.4375F, 1.0F, 1.0F, 0.5625F);
}
//---- Above ----\\
else if (Direction==2){ //x-
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5625F, 1.0F, 1.0F);
}
else if (Direction==3){ //z+
this.setBlockBounds(0.0F, 0.0F, 0.4375F, 1.0F, 1.0F, 1.0F);
}
else if (Direction==4){ //x+
this.setBlockBounds(0.4375F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
else if (Direction==5){ //z-
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5625F);
}
//---- Below ----\\
else if (Direction==6){ //x+
this.setBlockBounds(0.4375F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
else if (Direction==7){ //z-
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5625F);
}
else if (Direction=={ //x-
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5625F, 1.0F, 1.0F);
}
else if (Direction==9){ //z+
this.setBlockBounds(0.0F, 0.0F, 0.4375F, 1.0F, 1.0F, 1.0F);
}
else{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
}
@Override
public TileEntity createNewTileEntity(World var1, int var2) {
return new TEsail();
}
public void breakBlock(World world, int x, int y, int z, int i, int j)
{
world.removeTileEntity(x, y, z);
}
}
[glow=yellow,2,300]ItemSail[/glow]
package ships.addon.blocks_items;
import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
public class ItemSail extends ItemBlock{
public ItemSail(Block block) {
super(block);
this.setHasSubtypes(true);
}
public String getUnlocalizedName(ItemStack item){
int i = item.getItemDamage();
if(i<0||i>=BlockSail.subBlocks.length){
i=0;
}
return super.getUnlocalizedName()+"."+BlockSail.subBlocks[~i&15];
}
public int getMetadata(int meta){
return meta;
}
}
[glow=green,2,300]TileEnity[/glow]
package ships.addon.blocks_items;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
public class TEsail extends TileEntity {
private byte Direction;
@Override
public AxisAlignedBB getRenderBoundingBox()
{
return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
}
//---- Setters and Getters ----\\
public byte getValue() {
return Direction;
}
public void setValue(byte value) {
Direction = value;
}
//---- Read and Write ----\\
public void writeToNBT(NBTTagCompound nbt)
{
nbt.setByte("Direction", this.Direction);
super.writeToNBT(nbt);
markForUpdate();
}
public void readFromNBT(NBTTagCompound nbt)
{
this.Direction = nbt.getByte("Direction");
super.readFromNBT(nbt);
}
//---- Packets ----\\
@Override
public Packet getDescriptionPacket(){
NBTTagCompound tileTag = new NBTTagCompound();
this.writeToNBT(tileTag);
return new S35PacketUpdateTileEntity(this.xCoord,this.yCoord,this.zCoord,0,tileTag);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
{
this.readFromNBT(pkt.func_148857_g());
}
//---- Mark for Update ----\\
public void markForUpdate() {
this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
[glow=red,2,300]Render[/glow] I tried to get it to render in the inventory by adding implements ISimpleBlockRenderingHandler to the class but it hasn't worked
package ships.addon.blocks_items;
import net.minecraft.block.Block;
import net.minecraft.block.BlockAnvil;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.Entity;
import net.minecraft.world.IBlockAccess;
import ships.addon.baseclass.Registry;
import ships.addon.blocks_items.BlockSail;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import ships.addon.lib.Ref;
import ships.addon.models.AcendingSailModel;
import ships.addon.models.MastModel;
import ships.addon.models.SailModel;
public class RenderSail extends TileEntitySpecialRenderer implements ISimpleBlockRenderingHandler{
private static ResourceLocation textureSail = new ResourceLocation("sailsaddon"+":"+"textures/blocks/sail_white.png");
private SailModel sail;
private AcendingSailModel acending;
public static final double POSITION_FIX = -0.5D;
private static TEsail TEsail = new TEsail();
public RenderSail(){
this.sail = new SailModel();
this.acending = new AcendingSailModel();
}
@Override
public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f){
GL11.glPushMatrix();
TileEntity loc = tileentity.getWorldObj().getTileEntity(tileentity.xCoord, tileentity.yCoord, tileentity.zCoord);
textureSail = new ResourceLocation("sailsaddon"+":"+"textures/blocks/sail_"+BlockSail.subBlocks[~loc.getBlockMetadata()&15]+".png");
GL11.glTranslatef((float)x+0.5F,(float)y-0.5F,(float)z+0.5F);
this.bindTexture(textureSail);
byte Direction = ((TEsail)loc).getValue();
int dir = 0;
dir = Direction;
if(Direction>1&&Direction<=5){dir = Direction-2;}
else if(Direction>5){dir = Direction-6;}
GL11.glRotatef((float)dir*90, 0.0F, 1.0F, 0.0F);
if(Direction>5){GL11.glTranslatef(0.5F,0.0F,0.0F);}
if(Direction<=1){this.sail.renderModel(0.0625F);}
else if(Direction>1){this.acending.renderModel(0.0625F);}
GL11.glPopMatrix();
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId,RenderBlocks renderer) {
renderTileEntityAt(TEsail, POSITION_FIX, POSITION_FIX, POSITION_FIX, 0.0F);
}
@Override
public int getRenderId() {
return Registry.Sail.getRenderType();
}
@Override
public boolean shouldRender3DInInventory(int sail) {
return true;
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
return false;
}
}