I am attempting to follow the tutorial http://www.minecraftforge.net/wiki/Containers_and_GUIs here for tileentitys and GUI's without any luck. The two problems i have are that when i run my mod and save then reload the world, my tileentity (tinyBlock) blocks wont save. The other problem is that i cant get GUis to open. When i right click my block (tinyBlock), the java console tells me that "A mod tried to open a gui on the server without being a NetworkMod"
Thanks for the help in advance:)
Here is my code:
MageCraft_Main.java
package mageCraft.common;
import mageCraft.client.Client_MageCraftProxy;
import net.minecraft.src.Block;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid = "Fred4106_MageCraft", name = "MageCraft", version = "0.1 alpha")
@NetworkMod(clientSideRequired = true, serverSideRequired = true)
public class MageCraft_Main {
@SidedProxy(clientSide = "mageCraft.client.Client_MageCraftProxy", serverSide = "mageCraft.common.Common_MageCraftProxy")
public static Common_MageCraftProxy proxy;
MageCraftGuiHandler guiHandler = new MageCraftGuiHandler();
//Blocks
public static Block veriniteOreBlock;
public static Block veriniteIngotBlock;
public static Block blockTinyBlock;
//rarity
public static int veriniteOreRarity = 4;
//Items
public static Item veriniteChunkItem;
public static Item veriniteIngotItem;
public static Item veriniteEssenceItem;
@Init
public void load(FMLInitializationEvent event)
{
//Textures and other network things
//"this" is an instance of the mod class
NetworkRegistry.instance().registerGuiHandler(this, guiHandler);
proxy.registerRenderThings();
//Blocks
veriniteOreBlock = new BlockVeriniteOre(230, 0).setStepSound(Block.soundStoneFootstep).setHardness(3F).setResistance(1.0F).setBlockName("VeriniteOreBlock");
veriniteIngotBlock = new BlockVeriniteIngot(231,1).setStepSound(Block.soundMetalFootstep).setHardness(5F).setResistance(1.0F).setBlockName("VeriniteIngotBlock");
blockTinyBlock = new BlockTiny(232, 1);
//Register Blocks
GameRegistry.registerBlock(veriniteOreBlock);
GameRegistry.registerBlock(veriniteIngotBlock);
GameRegistry.registerBlock(blockTinyBlock);
LanguageRegistry.addName(veriniteOreBlock, "Verinite Ore");
LanguageRegistry.addName(veriniteIngotBlock, "Verinite Block");
LanguageRegistry.addName(blockTinyBlock, "Test Container");
//Items
veriniteChunkItem = new ItemVeriniteChunk(550).setIconIndex(0).setItemName("VeriniteChunkItem");
veriniteIngotItem = new ItemVeriniteIngot(551).setIconIndex(1).setItemName("VeriniteIngotItem");
veriniteEssenceItem = new ItemVeriniteEssence(552).setIconIndex(2).setItemName("VeriniteEssenceItem");
//Register Items
LanguageRegistry.addName(veriniteChunkItem, "Verinite Chunk");
LanguageRegistry.addName(veriniteIngotItem, "Verinite Ingot");
LanguageRegistry.addName(veriniteEssenceItem, "Verinite Essence");
//World Generation
GameRegistry.registerWorldGenerator(new WorldGen());
//Recipes
GameRegistry.addRecipe(new ItemStack(veriniteIngotBlock), new Object[]
{
"XXX", "X X", "XXX", 'X', veriniteIngotItem
});
GameRegistry.addRecipe(new ItemStack(blockTinyBlock), new Object[]
{
"X ", " ", " ", 'X', veriniteIngotBlock
});
//Smelting
GameRegistry.addSmelting(veriniteChunkItem.shiftedIndex, new ItemStack(veriniteIngotItem), 0.1F);
}
}
MageCraftGuiHandler.java
package mageCraft.common;
import net.minecraft.src.*;
import cpw.mods.fml.common.network.IGuiHandler;
public class MageCraftGuiHandler implements IGuiHandler{
//returns an instance of the Container you made earlier
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world,
int x, int y, int z) {
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileEntityImbuener){
return new ContainerTiny(player.inventory, (TileEntityImbuener) tileEntity);
}
return null;
}
//returns an instance of the Gui you made earlier
@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world,
int x, int y, int z) {
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileEntityImbuener){
return new GuiTiny(player.inventory, (TileEntityImbuener) tileEntity);
}
return null;
}
}
TileEntityImbuener.java
package mageCraft.common;
import net.minecraft.src.*;
public class TileEntityImbuener extends TileEntity implements IInventory
{
private ItemStack[] toInbue;
public TileEntityImbuener()
{
toInbue = new ItemStack[1];
}
@Override
public int getSizeInventory()
{
return toInbue.length;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return toInbue[slot];
}
@Override
public ItemStack decrStackSize(int slot, int amt)
{
ItemStack stack = getStackInSlot(slot);
if (stack != null) {
if (stack.stackSize <= amt) {
setInventorySlotContents(slot, null);
} else {
stack = stack.splitStack(amt);
if (stack.stackSize == 0) {
setInventorySlotContents(slot, null);
}
}
}
return stack;
}
@Override
public ItemStack getStackInSlotOnClosing(int slot)
{
ItemStack stack = getStackInSlot(slot);
if (stack != null) {
setInventorySlotContents(slot, null);
}
return stack;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack)
{
toInbue[slot] = stack;
if (stack != null && stack.stackSize > getInventoryStackLimit()) {
stack.stackSize = getInventoryStackLimit();
}
}
@Override
public String getInvName() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public void onInventoryChanged() {
// TODO Auto-generated method stub
}
@Override
public boolean isUseableByPlayer(EntityPlayer player)
{
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this &&
player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64;
}
@Override
public void openChest() {
// TODO Auto-generated method stub
}
@Override
public void closeChest() {
// TODO Auto-generated method stub
}
@Override
public void readFromNBT(NBTTagCompound tagCompound)
{
super.readFromNBT(tagCompound);
NBTTagList tagList = tagCompound.getTagList("Inventory");
for (int i = 0; i < tagList.tagCount(); i++) {
NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i);
byte slot = tag.getByte("Slot");
if (slot >= 0 && slot < toInbue.length) {
toInbue[slot] = ItemStack.loadItemStackFromNBT(tag);
}
}
}
@Override
public void writeToNBT(NBTTagCompound tagCompound) {
super.writeToNBT(tagCompound);
NBTTagList itemList = new NBTTagList();
for (int i = 0; i < toInbue.length; i++) {
ItemStack stack = toInbue[i];
if (stack != null) {
NBTTagCompound tag = new NBTTagCompound();
tag.setByte("Slot", (byte) i);
stack.writeToNBT(tag);
itemList.appendTag(tag);
}
}
tagCompound.setTag("Inventory", itemList);
}
}
WorldGen.java
package mageCraft.common;
import java.util.Random;
import net.minecraft.src.IChunkProvider;
import net.minecraft.src.World;
import net.minecraft.src.WorldGenMinable;
import cpw.mods.fml.common.IWorldGenerator;
public class WorldGen implements IWorldGenerator {
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
{
switch (world.provider.worldType)
{
case -1: generateNether(world, random, chunkX*16, chunkZ*16);
case 0: generateSurface(world, random, chunkX*16, chunkZ*16);
}
}
private void generateSurface(World world, Random random, int blockX, int blockZ) {
int Xcoord;
int Ycoord;
int Zcoord;
for(int i = 0; i < MageCraft_Main.veriniteOreRarity; i++)
{
Xcoord = blockX + random.nextInt(16);
Ycoord = random.nextInt(20)+40;
Zcoord = blockZ + random.nextInt(16);
System.out.println("X: "+Xcoord+" Z: "+Zcoord);
(new WorldGenMinable(MageCraft_Main.veriniteOreBlock.blockID, 9)).generate(world, random, Xcoord, Ycoord, Zcoord);
}
}
private void generateNether(World world, Random random, int i, int j) {
// TODO Auto-generated method stub
}
}
BlockTiny.java
package mageCraft.common;
import java.util.Random;
import net.minecraft.src.*;
public class BlockTiny extends BlockContainer {
protected BlockTiny (int id, int spriteIndex) {
super(id, spriteIndex, Material.wood);
setHardness(2.0F);
setResistance(5.0F);
setBlockName("BlockTinyBlock");
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z,
EntityPlayer player, int idk, float what, float these, float are) {
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (tileEntity == null || player.isSneaking()) {
return false;
}
//opens gui, to be implemented later
player.openGui(MageCraft_Main.class, 0, world, x, y, z);
return true;
}
@Override
public void breakBlock(World world, int x, int y, int z, int par5, int par6) {
dropItems(world, x, y, z);
super.breakBlock(world, x, y, z, par5, par6);
}
private void dropItems(World world, int x, int y, int z){
Random rand = new Random();
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (!(tileEntity instanceof IInventory)) {
return;
}
IInventory inventory = (IInventory) tileEntity;
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack item = inventory.getStackInSlot(i);
if (item != null && item.stackSize > 0) {
float rx = rand.nextFloat() * 0.8F + 0.1F;
float ry = rand.nextFloat() * 0.8F + 0.1F;
float rz = rand.nextFloat() * 0.8F + 0.1F;
EntityItem entityItem = new EntityItem(world,
x + rx, y + ry, z + rz,
new ItemStack(item.itemID, item.stackSize, item.getItemDamage()));
if (item.hasTagCompound()) {
entityItem.item.setTagCompound((NBTTagCompound) item.getTagCompound().copy());
}
float factor = 0.05F;
entityItem.motionX = rand.nextGaussian() * factor;
entityItem.motionY = rand.nextGaussian() * factor + 0.2F;
entityItem.motionZ = rand.nextGaussian() * factor;
world.spawnEntityInWorld(entityItem);
item.stackSize = 0;
}
}
}
@Override
public TileEntity createNewTileEntity(World world) {
return new TileEntityImbuener();
}
}
BlockVeriniteIngot.java
package mageCraft.common;
import net.minecraft.src.Block;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Material;
public class BlockVeriniteIngot extends Block {
public BlockVeriniteIngot(int par1, int par2)
{
super(par1, par2, Material.iron);
this.setCreativeTab(CreativeTabs.tabBlock);
}
public String getTextureFile()
{
return "/MageCraft_Resources/BlockTextureSheet.png";
}
}
BlockVeriniteOre.java
package mageCraft.common;
import java.util.Random;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Material;
import net.minecraft.src.Block;
public class BlockVeriniteOre extends Block {
private int whatToDrop;
public BlockVeriniteOre(int par1, int par2)
{
super(par1, par2, Material.rock);
this.setCreativeTab(CreativeTabs.tabBlock);
}
public String getTextureFile()
{
return "/MageCraft_Resources/BlockTextureSheet.png";
}
public int idDropped(int par1, Random par2Random, int par3)
{
return whatToDrop;
}
public int quantityDropped(Random par1Random)
{
if((par1Random.nextInt(10)+1) > 3)
{
whatToDrop = MageCraft_Main.veriniteEssenceItem.shiftedIndex;
return par1Random.nextInt(+1;
}
else
{
whatToDrop = MageCraft_Main.veriniteChunkItem.shiftedIndex;
return 1;
}
}
}
Common_MageCraftProxy.java
package mageCraft.common;
public class Common_MageCraftProxy {
public void registerRenderThings()
{
}
}
ContainerTiny.java
package mageCraft.common;
import net.minecraft.src.*;
public class ContainerTiny extends Container {
protected TileEntityImbuener tileEntity;
public ContainerTiny (InventoryPlayer inventoryPlayer,TileEntityImbuener te){
tileEntity = te;
System.out.println("Created container");
//the Slot constructor takes the IInventory and the slot number in that it binds to
//and the x-y coordinates it resides on-screen
addSlotToContainer(new Slot(tileEntity, 0, 76, 37));
//commonly used vanilla code that adds the player's inventory
bindPlayerInventory(inventoryPlayer);
}
@Override
public boolean canInteractWith(EntityPlayer player) {
return tileEntity.isUseableByPlayer(player);
}
protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9,
8 + j * 18, 84 + i * 18));
}
}
for (int i = 0; i < 9; i++) {
addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
}
}
@Override
public ItemStack transferStackInSlot(int slot) {
ItemStack stack = null;
Slot slotObject = (Slot) inventorySlots.get(slot);
//null checks and checks if the item can be stacked (maxStackSize > 1)
if (slotObject != null && slotObject.getHasStack()) {
ItemStack stackInSlot = slotObject.getStack();
stack = stackInSlot.copy();
//merges the item into player inventory since its in the tileEntity
if (slot == 0) {
if (!mergeItemStack(stackInSlot, 1,
inventorySlots.size(), true)) {
return null;
}
//places it into the tileEntity is possible since its in the player inventory
} else if (!mergeItemStack(stackInSlot, 0, 1, false)) {
return null;
}
if (stackInSlot.stackSize == 0) {
slotObject.putStack(null);
} else {
slotObject.onSlotChanged();
}
}
return stack;
}
}
GuiTiny.java
package mageCraft.common;
import net.minecraft.src.*;
import org.lwjgl.opengl.GL11;
public class GuiTiny extends GuiContainer {
public GuiTiny (InventoryPlayer inventoryPlayer,
TileEntityImbuener tileEntity) {
//the container is instantiated and passed to the superclass for handling
super(new ContainerTiny(inventoryPlayer, tileEntity));
}
@Override
protected void drawGuiContainerForegroundLayer() {
//draw text and stuff here
//the parameters for drawString are: string, x, y, color
fontRenderer.drawString("Tiny", 8, 6, 4210752);
//draws "Inventory" or your regional equivalent
fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2,
int par3) {
//draw your Gui here, only thing you need to change is the path
int texture = mc.renderEngine.getTexture("/your/texture/path/here.png");
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.renderEngine.bindTexture(texture);
int x = (width - xSize) / 2;
int y = (height - ySize) / 2;
this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
}
}
ItemVeriniteChunk.java
package mageCraft.common;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Item;
public class ItemVeriniteChunk extends Item {
public ItemVeriniteChunk(int par1)
{
super(par1);
maxStackSize = 64;
this.setTabToDisplayOn(CreativeTabs.tabMaterials);
}
public String getTextureFile()
{
return "/MageCraft_Resources/ItemTextureSheet.png";
}
}
ItemVeriniteEssence.java
package mageCraft.common;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Item;
public class ItemVeriniteEssence extends Item{
public ItemVeriniteEssence(int par1)
{
super(par1);
maxStackSize = 64;
this.setTabToDisplayOn(CreativeTabs.tabMaterials);
}
public String getTextureFile()
{
return "/MageCraft_Resources/ItemTextureSheet.png";
}
}
ItemVeriniteIngot.java
package mageCraft.common;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Item;
public class ItemVeriniteIngot extends Item{
public ItemVeriniteIngot(int par1)
{
super(par1);
maxStackSize = 64;
this.setTabToDisplayOn(CreativeTabs.tabMaterials);
}
public String getTextureFile()
{
return "/MageCraft_Resources/ItemTextureSheet.png";
}
}
Client_MageCraftProxy.java
package mageCraft.client;
import mageCraft.common.Common_MageCraftProxy;
import net.minecraftforge.client.MinecraftForgeClient;
public class Client_MageCraftProxy extends Common_MageCraftProxy
{
@Override
public void registerRenderThings()
{
MinecraftForgeClient.preloadTexture("/MageCraft_Resources/BlockTextureSheet.png");
MinecraftForgeClient.preloadTexture("/MageCraft_Resources/ItemTextureSheet.png");
}
}
Thanks for the help.