Jump to content

[SOLVED][1.8] No Texture appears on blocks with Tile Entity


JimiIT92
 Share

Recommended Posts

As by title, i have a block that has a tile entity in it, but when placed it have no texture. Not the "missing texture" texture, is just transparent. I have registered the entity and the block, i think the json files are good, so i don't really know why this happens :/

Here is how it looks now

UuSOjkJ.png

And here is the code for my block

package mw.blocks;

import java.util.List;
import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityDaylightDetector;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends BlockContainer
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World worldIn, int meta)
    {
       return new TileEntityDynamicLamp(worldIn);
    }
}

The TileEntity code

package mw.entities.tileentity;

import mw.blocks.BlockDynamicLamp;
import net.minecraft.server.gui.IUpdatePlayerListBox;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class TileEntityDynamicLamp extends TileEntity implements IUpdatePlayerListBox
{
public TileEntityDynamicLamp(World world) {
	super();
}

/**
 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
 * ticks and creates a new spawn inside its implementation.
 */
@Override
public void update()
{
	if (this.worldObj != null && !this.worldObj.isRemote && this.worldObj.getTotalWorldTime() % 20L == 0L)
	{
		this.blockType = this.getBlockType();

		if (this.blockType != null && this.blockType instanceof BlockDynamicLamp)
		{
			((BlockDynamicLamp)this.blockType).updatePower(this.worldObj, this.pos);
		}
	}
}

}

And here is how i create and register the tile entity

public static TileEntityDynamicLamp dynamic_lamp;
....
dynamic_lamp = new TileEntityDynamicLamp(null);
....
GameRegistry.registerTileEntity(TileEntityDynamicLamp.class, "tileEntityDynamicLamp");

 

The JSON files are the files for a normal block, so i don't think you need to read that :/ I debugged the code and i figured it out that the entity is created, so appearently there's nothing wrong, but of course there is :/ Thanks in advance for all who will help me :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

A few things:

  • Don't extend BlockContainer (this is why your Block is invisible)
  • Never ever make a new instance of your TileEntity outside of createTileEntity. You must access the TE using world.getTileEntity only.
  • Why don't you use metadata to distinguish the two versions of your Block instead of using up 2 BlockIDs?
  • Your TileEntity must have a constructor that takes no arguments. I recommend to not make any other constructors besides it, it only get's confusing.
  • This line is useless:
    this.blockType = this.getBlockType();

    - Use

    getBlockType

    directly, and only that.

  • This check is useless:
    this.blockType instanceof BlockDynamicLamp


  • tileEntityDynamicLamp is a horrible identifier for your TileEntity. The "tileEntity" part of it is stupid, of course it's a TileEntity, what else would it be. Instead include your ModID to avoid collisions.

Link to comment
Share on other sites

I don't use metadata because it was the code from the 1.7.10 version (wich is the motivation of why i extend the BlockContainer class, in that version everything works fine) and in that (i talk about 1 year ago) i wasn't able to use metadata as well, i was very noob then, now i'm still a noob but not in total xD

The tile entity code has that two checks beacuse in past it was just a copy and paste of the TileEntityDaylightSensor, so i don't know they was useless :/

So now i've changed the TileEntity code to this

package mw.entities.tileentity;

import mw.blocks.BlockDynamicLamp;
import net.minecraft.server.gui.IUpdatePlayerListBox;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class TileEntityDynamicLamp extends TileEntity implements IUpdatePlayerListBox
{
public TileEntityDynamicLamp() {
	super();
}

/**
 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
 * ticks and creates a new spawn inside its implementation.
 */
@Override
public void update()
{
	if (this.worldObj != null && !this.worldObj.isRemote && this.worldObj.getTotalWorldTime() % 20L == 0L)
	{

		if (this.getBlockType() != null)
		{
			((BlockDynamicLamp)this.blockType).updatePower(this.worldObj, this.pos);
		}
	}
}

}

but now the code running in the update power function is not executed (i guess that is not creating a tile entity) :/

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

Show your updated Block class, and where you register your TileEntity.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

This is the updated block class (is not changed too much)

package mw.blocks;

import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends Block
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World worldIn, int meta)
    {
       return new TileEntityDynamicLamp();
    }
}

 

The tile entity is still registerd the way described above, with the initialization done in the preInit method and the registration done in the init method

dynamic_lamp = new TileEntityDynamicLamp();
....
GameRegistry.registerTileEntity(TileEntityDynamicLamp.class, "tileEntityDynamicLamp");

but according to what diesieben says i'm not supposed to call the entity initialization

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

Ok, so i've changed the createNewTileEntity method to createTileEntity, and added the hasTileEntity method, so now my block class looks like this

package mw.blocks;

import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends Block
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @Override
    public boolean hasTileEntity()
    {
    	return true;
    }
    
    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    @Override
    public TileEntity createTileEntity(World worldIn, IBlockState meta)
    {
    	return new TileEntityDynamicLamp();
    }
}

but it still does nothing, the code in the updatePower method is not executing

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

D'oh, i don't know why Eclipse doesn't warned me, maybe is tired xD Anyway that works, so thank for the help :D Just for curiosity, why extending BlockContainer makes an invisible block?

Don't blame me if i always ask for your help. I just want to learn to be better :)

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
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.

 Share



×
×
  • Create New...

Important Information

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