Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

MultiBlock structure problem


decebaldecebal
 Share

Recommended Posts

Hello guys,

I recently started creating a MultiBlock 2x2x2 structure that is made up of one type of block.I have managed to do (I think) almost all of it, but the problem I have is that the GUI won't open and that the Master TileEntity coordinates have ALWAYS the X axes value higher with one then the coordinate that the last block in the structure is placed.

 

I have made my structure have a MasterBlock in the low left corner.That is also the block you need to click on before the structure forms.What I did is that I used metadata to check with direction the block has in the world so that it will always be in the low left corner.

 

So the structure functions as follows:

You put down the first block in the bottom left facing you, then you place the other blocks need.After that, your right click the first block placed and the structure should form and open the GUI.

 

I have tested it and it seems like the structure forms, but the GUI is not opening, only when some glitch happens after I remove a block.

 

Also I have made so that if you remove a block, it make the MasterBlock in all the other TileEntities null.

 

Here is my code, I have looked for 5 hours at it now, and I still can not find what is wrong with it:

 

Advanced Coal Refiner(the block)

package general.blocks.Machines;

import lib.GuiIDs;
import general.geoactivity;
import general.blocks.Machines.ACR.ACRTileE;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class AdvancedCoalRefiner extends BlockContainer
{
public AdvancedCoalRefiner(int id, Material material)
{
	super(id, material);
}

/**
     * Called when the block is placed in the world.
     */
    public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int l = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 2);
        }

        if (l == 1)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 5, 2);
        }

        if (l == 2)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 2);
        }

        if (l == 3)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 4, 2);
        }

        if (par6ItemStack.hasDisplayName())
        {
            ((TileEntityFurnace)par1World.getBlockTileEntity(par2, par3, par4)).setGuiDisplayName(par6ItemStack.getDisplayName());
        }
        System.out.println(par1World.getBlockMetadata(par2, par3, par4));
    }

@Override
    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
	if (par1World.isRemote)
		return true;
	else
	{
		ACRTileE tile_entity = (ACRTileE) par1World.getBlockTileEntity(par2, par3, par4);
		if (tile_entity == null || par5EntityPlayer.isSneaking())
			return false;
		if(!tile_entity.isValid)
		{
			System.out.println("works1");
			if(tile_entity.checkMultiblock())
			{
				tile_entity.makeMultiBlock();
			}
		}
		if(tile_entity.isValid)
		{
			System.out.println("works3");
			ACRTileE core = (ACRTileE)tile_entity.getCore();
			if(core!=null)
			{
				System.out.println(core.xCoord + " " + core.yCoord + " " + core.zCoord);
				par5EntityPlayer.openGui(geoactivity.instance, GuiIDs.ACR, par1World, core.xCoord, core.yCoord, core.zCoord);
			}
		}
		return true;
	}
    }

@Override
    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
    {
	ACRTileE tile_entity = (ACRTileE) par1World.getBlockTileEntity(par2, par3, par4);
	ACRTileE core = tile_entity.getCore();
	if(core!=null)
	{
		System.out.println("destroy1");
		core.destroyMultiBlock();
	}

        super.breakBlock(par1World, par2, par3, par4, par5, par6);
        par1World.removeBlockTileEntity(par2, par3, par4);
    }

@Override
public TileEntity createNewTileEntity(World world)
{
	return new ACRTileE();
}
}

 

ACRTileE (the tile entity)

package general.blocks.Machines.ACR;

import general.geoactivity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;

public class ACRTileE extends TileEntity implements ISidedInventory
{	
ACRTileE coretile=null;
private int coreX, coreY, coreZ;
public boolean isValid=false;

public boolean checkMultiblock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}

				if(worldObj.getBlockId(xc, yc, zc)!=geoactivity.advancedcoalrefiner.blockID)
					return false;
			}
	return true;
}

public void makeMultiBlock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}
				ACRTileE tile_entity = (ACRTileE)worldObj.getBlockTileEntity(xc, yc, zc);
				if(tile_entity!=null)
				{
					System.out.println("works2");
					tile_entity.isValid=true;
					tile_entity.setCore(this);
				}
				System.out.println(getCore());
			}
	isValid=true;
	System.out.println(xCoord + " " + yCoord + " " + zCoord);
}

public void destroyMultiBlock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}
				ACRTileE tile_entity = (ACRTileE)worldObj.getBlockTileEntity(xc, yc, zc);
				if(tile_entity!=null)
				{
					tile_entity.isValid=false;
					tile_entity.setCore(null);
				}
				System.out.println(getCore());
			}
	isValid=false;
}

public ACRTileE getCore()
{
	if(coretile == null && coreX!=0 && coreY!=0 && coreZ!=0)
		coretile = (ACRTileE)worldObj.getBlockTileEntity(coreX, coreY, coreZ);

	return coretile;
}

public void setCore(ACRTileE core)
{		
	coretile = core;
	if(coretile!=null)
	{
		coreX = core.xCoord;
		coreY = core.yCoord;
		coreZ = core.zCoord;
	}
	else
	{
		coreX = 0;
		coreY = 0;
		coreZ = 0;
	}
}

@Override
public void readFromNBT(NBTTagCompound tagCompound)
{
	super.readFromNBT(tagCompound);

	coreX = tagCompound.getInteger("CoreX");
	coreY = tagCompound.getInteger("CoreY");
	coreZ = tagCompound.getInteger("CoreZ");
}

@Override
public void writeToNBT(NBTTagCompound tagCompound)
{
	super.writeToNBT(tagCompound);

	tagCompound.setInteger("CoreX", coreX);
	tagCompound.setInteger("CoreY", coreY);
	tagCompound.setInteger("CoreZ", coreZ);
}

@Override
public int getSizeInventory()
{
	// TODO Auto-generated method stub
	return 0;
}

@Override
public ItemStack getStackInSlot(int i)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public ItemStack decrStackSize(int i, int j)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public ItemStack getStackInSlotOnClosing(int i)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public void setInventorySlotContents(int i, ItemStack itemstack)
{
	// TODO Auto-generated method stub

}

@Override
public String getInvName()
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public boolean isInvNameLocalized()
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public int getInventoryStackLimit()
{
	// TODO Auto-generated method stub
	return 0;
}

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public void openChest()
{
	// TODO Auto-generated method stub

}

@Override
public void closeChest()
{
	// TODO Auto-generated method stub

}

@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public int[] getAccessibleSlotsFromSide(int var1)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public boolean canInsertItem(int i, ItemStack itemstack, int j)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public boolean canExtractItem(int i, ItemStack itemstack, int j)
{
	// TODO Auto-generated method stub
	return false;
}
}

 

The container (only used for testing purposes ATM)

package general.blocks.Machines.ACR;

import general.blocks.Machines.CR.CRSlot;
import general.blocks.Machines.CR.CRTileE;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;

public class ACRContainer extends Container
{
public ACRContainer(ACRTileE par2TileEntityFurnace, InventoryPlayer par1InventoryPlayer)
{
	//furnace = par2TileEntityFurnace;
	/*
	this.addSlotToContainer(new Slot(par2TileEntityFurnace, 0, 66, 35));
	this.addSlotToContainer(new Slot(par2TileEntityFurnace, 1, 30, 35));
	this.addSlotToContainer(new CRSlot(par1InventoryPlayer.player, par2TileEntityFurnace, 2, 126, 35));
	*/
	int var3;

	for (var3 = 0; var3 < 3; ++var3)
		for (int var4 = 0; var4 < 9; ++var4)
			this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18));

	for (var3 = 0; var3 < 9; ++var3)
		this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142));
}


@Override
public boolean canInteractWith(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

}

 

The GUI (again only used for testing)

package general.blocks.Machines.ACR;

import general.blocks.Machines.CR.CRContainer;
import general.blocks.Machines.CR.CRTileE;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.opengl.GL11;

public class ACRGUI extends GuiContainer
{
private static final ResourceLocation field_110410_t = new ResourceLocation("GeoActivity:textures/gui/CR.png");
private ACRTileE furnaceInventory;

public ACRGUI(InventoryPlayer par1InventoryPlayer, ACRTileE par2TileEntityFurnace)
{
	super(new ACRContainer(par2TileEntityFurnace, par1InventoryPlayer));
	furnaceInventory = par2TileEntityFurnace;
}

@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2)
{
	fontRenderer.drawString("Coal Refiner", 60, 8, 4210752);
	fontRenderer.drawString("Inventory", 8, ySize - 96 + 2, 4210752);
}

@Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

	mc.func_110434_K().func_110577_a(field_110410_t);
	int var5 = (width - xSize) / 2;
	int var6 = (height - ySize) / 2;
	this.drawTexturedModalRect(var5, var6, 0, 0, xSize, ySize);
	int var7;

	/*
	if (furnaceInventory.isBurning())
	{
		var7 = furnaceInventory.getBurnTimeRemainingScaled(12);
		this.drawTexturedModalRect(var5 + 49, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2);
	}

	var7 = furnaceInventory.getCookProgressScaled(24);
	this.drawTexturedModalRect(var5 + 89, var6 + 34, 176, 14, var7 + 1, 16);
	*/
}
}

 

Gui Handler

package core;

import general.blocks.CM.CMI.CMIContainer;
import general.blocks.CM.CMI.CMIGUI;
import general.blocks.CM.CMI.CMITileE;
import general.blocks.CM.CMII.CMIIContainer;
import general.blocks.CM.CMII.CMIIGUI;
import general.blocks.CM.CMII.CMIITileE;
import general.blocks.Machines.ACR.ACRContainer;
import general.blocks.Machines.ACR.ACRGUI;
import general.blocks.Machines.ACR.ACRTileE;
import general.blocks.Machines.CR.CRContainer;
import general.blocks.Machines.CR.CRGUI;
import general.blocks.Machines.CR.CRTileE;
import general.items.tools.Adv.AdvContainer;
import general.items.tools.Adv.AdvGUI;
import general.items.tools.Adv.AdvInventory;
import general.items.tools.RM.RMContainer;
import general.items.tools.RM.RMGUI;
import general.items.tools.RM.RMInventory;
import lib.GuiIDs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class guiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
	if (!world.blockExists(x, y, z))
		return null;

	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);

	switch (id)
	{
		case GuiIDs.ACR:
			if (!(tile_entity instanceof ACRTileE))
				return null;
			return new ACRContainer((ACRTileE) tile_entity, player.inventory);
		default:
			return null;
	}
}

@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
	if (!world.blockExists(x, y, z))
		return null;

	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);

	switch (id)
	{
		case GuiIDs.ACR:
			if (!(tile_entity instanceof ACRTileE))
				return null;
			return new ACRGUI(player.inventory, (ACRTileE) tile_entity);
		default:
			return null;
	}
}
}

 

I have also registered the TileEntity and the block correctly.

 

I think the problem is in the onBlockActivated activated method, but I am not quite sure...

Link to comment
Share on other sites

In tile entity:

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

In container:

@Override
public boolean canInteractWith(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

 

I don't think you want those to be always false.

Link to comment
Share on other sites

In tile entity:

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

In container:

@Override
public boolean canInteractWith(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

 

I don't think you want those to be always false.

 

Thank you very much, I knew I made some stupid mistake, I often do.

Link to comment
Share on other sites

Hello guys,

I recently started creating a MultiBlock 2x2x2 structure that is made up of one type of block.I have managed to do (I think) almost all of it, but the problem I have is that the GUI won't open and that the Master TileEntity coordinates have ALWAYS the X axes value higher with one then the coordinate that the last block in the structure is placed.

 

I have made my structure have a MasterBlock in the low left corner.That is also the block you need to click on before the structure forms.What I did is that I used metadata to check with direction the block has in the world so that it will always be in the low left corner.

 

So the structure functions as follows:

You put down the first block in the bottom left facing you, then you place the other blocks need.After that, your right click the first block placed and the structure should form and open the GUI.

 

I have tested it and it seems like the structure forms, but the GUI is not opening, only when some glitch happens after I remove a block.

 

Also I have made so that if you remove a block, it make the MasterBlock in all the other TileEntities null.

 

Here is my code, I have looked for 5 hours at it now, and I still can not find what is wrong with it:

 

Advanced Coal Refiner(the block)

package general.blocks.Machines;

import lib.GuiIDs;
import general.geoactivity;
import general.blocks.Machines.ACR.ACRTileE;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class AdvancedCoalRefiner extends BlockContainer
{
public AdvancedCoalRefiner(int id, Material material)
{
	super(id, material);
}

/**
     * Called when the block is placed in the world.
     */
    public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int l = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 2);
        }

        if (l == 1)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 5, 2);
        }

        if (l == 2)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 2);
        }

        if (l == 3)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 4, 2);
        }

        if (par6ItemStack.hasDisplayName())
        {
            ((TileEntityFurnace)par1World.getBlockTileEntity(par2, par3, par4)).setGuiDisplayName(par6ItemStack.getDisplayName());
        }
        System.out.println(par1World.getBlockMetadata(par2, par3, par4));
    }

@Override
    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
	if (par1World.isRemote)
		return true;
	else
	{
		ACRTileE tile_entity = (ACRTileE) par1World.getBlockTileEntity(par2, par3, par4);
		if (tile_entity == null || par5EntityPlayer.isSneaking())
			return false;
		if(!tile_entity.isValid)
		{
			System.out.println("works1");
			if(tile_entity.checkMultiblock())
			{
				tile_entity.makeMultiBlock();
			}
		}
		if(tile_entity.isValid)
		{
			System.out.println("works3");
			ACRTileE core = (ACRTileE)tile_entity.getCore();
			if(core!=null)
			{
				System.out.println(core.xCoord + " " + core.yCoord + " " + core.zCoord);
				par5EntityPlayer.openGui(geoactivity.instance, GuiIDs.ACR, par1World, core.xCoord, core.yCoord, core.zCoord);
			}
		}
		return true;
	}
    }

@Override
    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
    {
	ACRTileE tile_entity = (ACRTileE) par1World.getBlockTileEntity(par2, par3, par4);
	ACRTileE core = tile_entity.getCore();
	if(core!=null)
	{
		System.out.println("destroy1");
		core.destroyMultiBlock();
	}

        super.breakBlock(par1World, par2, par3, par4, par5, par6);
        par1World.removeBlockTileEntity(par2, par3, par4);
    }

@Override
public TileEntity createNewTileEntity(World world)
{
	return new ACRTileE();
}
}

 

ACRTileE (the tile entity)

package general.blocks.Machines.ACR;

import general.geoactivity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;

public class ACRTileE extends TileEntity implements ISidedInventory
{	
ACRTileE coretile=null;
private int coreX, coreY, coreZ;
public boolean isValid=false;

public boolean checkMultiblock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}

				if(worldObj.getBlockId(xc, yc, zc)!=geoactivity.advancedcoalrefiner.blockID)
					return false;
			}
	return true;
}

public void makeMultiBlock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}
				ACRTileE tile_entity = (ACRTileE)worldObj.getBlockTileEntity(xc, yc, zc);
				if(tile_entity!=null)
				{
					System.out.println("works2");
					tile_entity.isValid=true;
					tile_entity.setCore(this);
				}
				System.out.println(getCore());
			}
	isValid=true;
	System.out.println(xCoord + " " + yCoord + " " + zCoord);
}

public void destroyMultiBlock()
{
	int meta = this.getBlockMetadata();
	int xc, zc, yc;

	for(int x=0;x<=1;x++)
		for(int z=0;z<=1;z++)
			for(int y=0;y<=1;y++)
			{
				yc = yCoord + y;
				xc = xCoord;
				zc = zCoord;
				if(meta==3)
				{
					xc = xCoord + x;
					zc = zCoord - z;
				}
				else if(meta==2)
				{
					xc = xCoord - x;
					zc = zCoord + z;
				}
				else if(meta==5)
				{
					xc = xCoord - x;
					zc = zCoord - z;
				}
				else if(meta==4)
				{
					xc = xCoord + x;
					zc = zCoord + z;
				}
				ACRTileE tile_entity = (ACRTileE)worldObj.getBlockTileEntity(xc, yc, zc);
				if(tile_entity!=null)
				{
					tile_entity.isValid=false;
					tile_entity.setCore(null);
				}
				System.out.println(getCore());
			}
	isValid=false;
}

public ACRTileE getCore()
{
	if(coretile == null && coreX!=0 && coreY!=0 && coreZ!=0)
		coretile = (ACRTileE)worldObj.getBlockTileEntity(coreX, coreY, coreZ);

	return coretile;
}

public void setCore(ACRTileE core)
{		
	coretile = core;
	if(coretile!=null)
	{
		coreX = core.xCoord;
		coreY = core.yCoord;
		coreZ = core.zCoord;
	}
	else
	{
		coreX = 0;
		coreY = 0;
		coreZ = 0;
	}
}

@Override
public void readFromNBT(NBTTagCompound tagCompound)
{
	super.readFromNBT(tagCompound);

	coreX = tagCompound.getInteger("CoreX");
	coreY = tagCompound.getInteger("CoreY");
	coreZ = tagCompound.getInteger("CoreZ");
}

@Override
public void writeToNBT(NBTTagCompound tagCompound)
{
	super.writeToNBT(tagCompound);

	tagCompound.setInteger("CoreX", coreX);
	tagCompound.setInteger("CoreY", coreY);
	tagCompound.setInteger("CoreZ", coreZ);
}

@Override
public int getSizeInventory()
{
	// TODO Auto-generated method stub
	return 0;
}

@Override
public ItemStack getStackInSlot(int i)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public ItemStack decrStackSize(int i, int j)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public ItemStack getStackInSlotOnClosing(int i)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public void setInventorySlotContents(int i, ItemStack itemstack)
{
	// TODO Auto-generated method stub

}

@Override
public String getInvName()
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public boolean isInvNameLocalized()
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public int getInventoryStackLimit()
{
	// TODO Auto-generated method stub
	return 0;
}

@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public void openChest()
{
	// TODO Auto-generated method stub

}

@Override
public void closeChest()
{
	// TODO Auto-generated method stub

}

@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public int[] getAccessibleSlotsFromSide(int var1)
{
	// TODO Auto-generated method stub
	return null;
}

@Override
public boolean canInsertItem(int i, ItemStack itemstack, int j)
{
	// TODO Auto-generated method stub
	return false;
}

@Override
public boolean canExtractItem(int i, ItemStack itemstack, int j)
{
	// TODO Auto-generated method stub
	return false;
}
}

 

The container (only used for testing purposes ATM)

package general.blocks.Machines.ACR;

import general.blocks.Machines.CR.CRSlot;
import general.blocks.Machines.CR.CRTileE;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;

public class ACRContainer extends Container
{
public ACRContainer(ACRTileE par2TileEntityFurnace, InventoryPlayer par1InventoryPlayer)
{
	//furnace = par2TileEntityFurnace;
	/*
	this.addSlotToContainer(new Slot(par2TileEntityFurnace, 0, 66, 35));
	this.addSlotToContainer(new Slot(par2TileEntityFurnace, 1, 30, 35));
	this.addSlotToContainer(new CRSlot(par1InventoryPlayer.player, par2TileEntityFurnace, 2, 126, 35));
	*/
	int var3;

	for (var3 = 0; var3 < 3; ++var3)
		for (int var4 = 0; var4 < 9; ++var4)
			this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18));

	for (var3 = 0; var3 < 9; ++var3)
		this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142));
}


@Override
public boolean canInteractWith(EntityPlayer entityplayer)
{
	// TODO Auto-generated method stub
	return false;
}

}

 

The GUI (again only used for testing)

package general.blocks.Machines.ACR;

import general.blocks.Machines.CR.CRContainer;
import general.blocks.Machines.CR.CRTileE;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.opengl.GL11;

public class ACRGUI extends GuiContainer
{
private static final ResourceLocation field_110410_t = new ResourceLocation("GeoActivity:textures/gui/CR.png");
private ACRTileE furnaceInventory;

public ACRGUI(InventoryPlayer par1InventoryPlayer, ACRTileE par2TileEntityFurnace)
{
	super(new ACRContainer(par2TileEntityFurnace, par1InventoryPlayer));
	furnaceInventory = par2TileEntityFurnace;
}

@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2)
{
	fontRenderer.drawString("Coal Refiner", 60, 8, 4210752);
	fontRenderer.drawString("Inventory", 8, ySize - 96 + 2, 4210752);
}

@Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

	mc.func_110434_K().func_110577_a(field_110410_t);
	int var5 = (width - xSize) / 2;
	int var6 = (height - ySize) / 2;
	this.drawTexturedModalRect(var5, var6, 0, 0, xSize, ySize);
	int var7;

	/*
	if (furnaceInventory.isBurning())
	{
		var7 = furnaceInventory.getBurnTimeRemainingScaled(12);
		this.drawTexturedModalRect(var5 + 49, var6 + 36 + 12 - var7, 176, 12 - var7, 14, var7 + 2);
	}

	var7 = furnaceInventory.getCookProgressScaled(24);
	this.drawTexturedModalRect(var5 + 89, var6 + 34, 176, 14, var7 + 1, 16);
	*/
}
}

 

Gui Handler

package core;

import general.blocks.CM.CMI.CMIContainer;
import general.blocks.CM.CMI.CMIGUI;
import general.blocks.CM.CMI.CMITileE;
import general.blocks.CM.CMII.CMIIContainer;
import general.blocks.CM.CMII.CMIIGUI;
import general.blocks.CM.CMII.CMIITileE;
import general.blocks.Machines.ACR.ACRContainer;
import general.blocks.Machines.ACR.ACRGUI;
import general.blocks.Machines.ACR.ACRTileE;
import general.blocks.Machines.CR.CRContainer;
import general.blocks.Machines.CR.CRGUI;
import general.blocks.Machines.CR.CRTileE;
import general.items.tools.Adv.AdvContainer;
import general.items.tools.Adv.AdvGUI;
import general.items.tools.Adv.AdvInventory;
import general.items.tools.RM.RMContainer;
import general.items.tools.RM.RMGUI;
import general.items.tools.RM.RMInventory;
import lib.GuiIDs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class guiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
	if (!world.blockExists(x, y, z))
		return null;

	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);

	switch (id)
	{
		case GuiIDs.ACR:
			if (!(tile_entity instanceof ACRTileE))
				return null;
			return new ACRContainer((ACRTileE) tile_entity, player.inventory);
		default:
			return null;
	}
}

@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
	if (!world.blockExists(x, y, z))
		return null;

	TileEntity tile_entity = world.getBlockTileEntity(x, y, z);

	switch (id)
	{
		case GuiIDs.ACR:
			if (!(tile_entity instanceof ACRTileE))
				return null;
			return new ACRGUI(player.inventory, (ACRTileE) tile_entity);
		default:
			return null;
	}
}
}

 

I have also registered the TileEntity and the block correctly.

 

I think the problem is in the onBlockActivated activated method, but I am not quite sure...

 

Nothing to do with the question, but use github or pastebin for your code - its cleaner and then we can look anywere in ur code to try and fix it.

Lets make forge modding the best it can be!

Link to comment
Share on other sites

@biggles, my work network block pastebin and github

@op, please continue to use the forums and maybe ALSO add a link to your github :)

 

Well at the moment I have not set up GitHub, but when I will come from vacation I will set up one.

 

Also, the multiblock works perfectly!I've managed to fix it myself and I know have some more understanding of multiblocks.

 

If anyone else wants to do a multi block, this tutorial helped me very much:

 

http://minalien.com/tutorial-multi-block-structures-in-minecraft/

Link to comment
Share on other sites

And now is the challenge to figure out how to be able to place the blocks in any way you want, and without the need to rightclick the base multiblock block to form the multiblock  ;D. Good luck :)

Author of PneumaticCraft, MineChess, Minesweeper Mod and Sokoban Mod. Visit www.minemaarten.com to take a look at them.

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



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Ahh ok  But also in mods with custom armor you normally use resourcepacks for the model (every mod has a built-in resource pack), so there really is no need. If you want to do it anyway ... it's your choice 
    • Well, im just learning) Wanna make my own mods in future.
    • Hi! You don't need an extra Mod to do this, you can just use a resource pack and replace the armor texture and model
    • hello. I try to create my custom chest BUT that's make me crazy. 1.if I put an item in my custom chest it become doubled, and if I click it ,it will be dispeared.:( 2.the custom chest what i made use the same container in different blocks.   TileEntity: public class SFCTileEntity extends TileEntity implements INamedContainerProvider { public static final int NUMBER_OF_SLOTS = 27; public SFCTileEntity() { super(TileEntityTypeRegistry.TileEntity.get()); chestContents = ChestContents.createForTileEntity(NUMBER_OF_SLOTS, this::canPlayerAccessInventory, this::setChanged); } public boolean canPlayerAccessInventory(PlayerEntity player) { if (this.level.getBlockEntity(this.worldPosition) != this) return false; final double X_CENTRE_OFFSET = 0.5; final double Y_CENTRE_OFFSET = 0.5; final double Z_CENTRE_OFFSET = 0.5; final double MAXIMUM_DISTANCE_SQ = 8.0 * 8.0; return player.distanceToSqr(worldPosition.getX() + X_CENTRE_OFFSET, worldPosition.getY() + Y_CENTRE_OFFSET, worldPosition.getZ() + Z_CENTRE_OFFSET) < MAXIMUM_DISTANCE_SQ; } private static final String CHESTCONTENTS_INVENTORY_TAG = "contents"; @Override public CompoundNBT save(CompoundNBT parentNBTTagCompound) { super.save(parentNBTTagCompound); CompoundNBT inventoryNBT = chestContents.serializeNBT(); parentNBTTagCompound.put(CHESTCONTENTS_INVENTORY_TAG, inventoryNBT); return parentNBTTagCompound; } @Override public void load(BlockState blockState, CompoundNBT parentNBTTagCompound) { super.load(blockState, parentNBTTagCompound); CompoundNBT inventoryNBT = parentNBTTagCompound.getCompound(CHESTCONTENTS_INVENTORY_TAG); chestContents.deserializeNBT(inventoryNBT); } @Override @Nullable public SUpdateTileEntityPacket getUpdatePacket() { CompoundNBT nbtTagCompound = new CompoundNBT(); save(nbtTagCompound); int tileEntityType = 42; return new SUpdateTileEntityPacket(this.worldPosition, tileEntityType, nbtTagCompound); } @Override public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { BlockState blockState = level.getBlockState(worldPosition); load(blockState, pkt.getTag()); } @Override public CompoundNBT getUpdateTag() { CompoundNBT nbtTagCompound = new CompoundNBT(); save(nbtTagCompound); return nbtTagCompound; } /* Populates this TileEntity with information from the tag, used by vanilla to transmit from server to client * The vanilla default is suitable for this example but I've included an explicit definition anyway. */ @Override public void handleUpdateTag(BlockState blockState, CompoundNBT tag) { this.load(blockState, tag); } @Override public ITextComponent getDisplayName() { return null; } @Nullable @Override public Container createMenu(int windowID, PlayerInventory playerInventory, PlayerEntity playerEntity) { return SFContainer.createContainerServerSide(windowID, playerInventory, chestContents); } public static ChestContents getChestContents() { return chestContents; } private static ChestContents chestContents; }   Container: public class SFContainer extends Container { private static final int HOTBAR_SLOT_COUNT = 9; private static final int PLAYER_INVENTORY_ROW_COUNT = 3; private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9; private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT; private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT; private static final int VANILLA_FIRST_SLOT_INDEX = 0; private static final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT; private static final int TE_INVENTORY_SLOT_COUNT = SFCTileEntity.NUMBER_OF_SLOTS; public static final int TILE_INVENTORY_YPOS = 18; public static final int PLAYER_INVENTORY_YPOS = 86; public SFContainer(int windowID, PlayerInventory playerInventory, ChestContents chestContents) { super(ContainerTypeRegistry.Container.get(), windowID); PlayerInvWrapper playerInventoryForge = new PlayerInvWrapper(playerInventory); this.chestContents = chestContents; final int SLOT_X_SPACING = 18; final int SLOT_Y_SPACING = 18; final int HOTBAR_XPOS = 8; final int HOTBAR_YPOS = 144; for (int x = 0; x < HOTBAR_SLOT_COUNT; x++) { int slotNumber = x; addSlot(new SlotItemHandler(playerInventoryForge, slotNumber, HOTBAR_XPOS + SLOT_X_SPACING * x, HOTBAR_YPOS)); } final int PLAYER_INVENTORY_XPOS = 8; // Add the rest of the player's inventory to the gui for (int y = 0; y < PLAYER_INVENTORY_ROW_COUNT; y++) { for (int x = 0; x < PLAYER_INVENTORY_COLUMN_COUNT; x++) { int slotNumber = HOTBAR_SLOT_COUNT + y * PLAYER_INVENTORY_COLUMN_COUNT + x; int xpos = PLAYER_INVENTORY_XPOS + x * SLOT_X_SPACING; int ypos = PLAYER_INVENTORY_YPOS + y * SLOT_Y_SPACING; addSlot(new SlotItemHandler(playerInventoryForge, slotNumber, xpos, ypos)); } } // Add the tile inventory container to the gui for(int i = 0;i<9;i++){ addSlot(new Slot(chestContents, i, 8+18*i, 18)); addSlot(new Slot(chestContents, i+9, 8+18*i, 36)); addSlot(new Slot(chestContents, i+18, 8+18*i, 54)); } } public static SFContainer createContainerServerSide(int windowID, PlayerInventory playerInventory, ChestContents chestContents) { return new SFContainer(windowID, playerInventory, chestContents); } public static SFContainer createContainerClientSide(int windowID, PlayerInventory playerInventory, net.minecraft.network.PacketBuffer extraData) { ChestContents chestContents = ChestContents.createForClientSideContainer(SFCTileEntity.NUMBER_OF_SLOTS); return new SFContainer(windowID, playerInventory, chestContents); } @Override public boolean stillValid(PlayerEntity playerEntity) { return chestContents.stillValid(playerEntity); } @Override public ItemStack quickMoveStack(PlayerEntity playerEntity, int sourceSlotIndex) { Slot sourceSlot = getSlot(sourceSlotIndex); if (sourceSlot == null || !sourceSlot.hasItem()) return ItemStack.EMPTY; //EMPTY_ITEM ItemStack sourceStack = sourceSlot.getItem(); ItemStack copyOfSourceStack = sourceStack.copy(); // Check if the slot clicked is one of the vanilla container slots if (sourceSlotIndex >= VANILLA_FIRST_SLOT_INDEX && sourceSlotIndex < VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT) { // This is a vanilla container slot so merge the stack into the tile inventory if (!moveItemStackTo(sourceStack, TE_INVENTORY_FIRST_SLOT_INDEX, TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT, false)){ return ItemStack.EMPTY; // EMPTY_ITEM } } else if (sourceSlotIndex >= TE_INVENTORY_FIRST_SLOT_INDEX && sourceSlotIndex < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) { // This is a TE slot so merge the stack into the players inventory if (!moveItemStackTo(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT, false)) { return ItemStack.EMPTY; } } else { LOGGER.warn("Invalid slotIndex:" + sourceSlotIndex); return ItemStack.EMPTY; } // If stack size == 0 (the entire stack was moved) set slot contents to null if (sourceStack.getCount() == 0) { sourceSlot.mayPlace(ItemStack.EMPTY); } else { sourceSlot.setChanged(); } sourceSlot.onTake(playerEntity, sourceStack); return copyOfSourceStack; } // pass the close container message to the parent inventory (not strictly needed for this example) // see ContainerChest and TileEntityChest - used to animate the lid when no players are accessing the chest any more @Override public void removed(PlayerEntity playerIn) { super.removed(playerIn); } private ChestContents chestContents; private static final Logger LOGGER = LogManager.getLogger(); }  
    • Posting again to finish this thread as I've found a solution for my problem. Don't know why it was having an issue with Java but uninstalled my most recent update of java and switched back to Java 17.02 Here's a link to the version of Java I'm now using https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe Hope it works for whoever is looking for a solution.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.