Jump to content

Recommended Posts

Posted

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 :)

Posted

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 :)

Posted

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 :)

Posted

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 :)

Posted

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 :)

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.