Jump to content

Recommended Posts

Posted

Hello friends, so first off I am new to modding so I am sorry if i ask a bunch of nooby questions.I have been trying to create my own custom "furnace"(its not a actual furnace but it acts like one)and when I go in game and open my gui when I try and grab some items from certain slots it instantly gets put back, but if I move over exactly 6 slots and click it will now pick up that item.Now, naturally I just thought I had gotten some measurements wrong so I compared it to vanilla furnace classes (it uses the furnace gui for right now to get rid of bad measuring) but everything is pretty spot on.

 

I cannot for the life of me get this right.I have been searching the internet for answers and I have found some solutions but none of them work for me. a couple were misplacing @NetworkMod and some things in client/common proxy files(the tutorial I was following did not use these files nor does the container call upon them) but nothing is working. Any input you guys can give me I would be extremely appreciative. thanks for any input!

 

For the record, I am not looking for handouts here, and I'm not looking for someone to write code for me. I like to learn things. But I have been working and researching this for hours and a day and can't figure it out. If by any chance someone does see a very obvious mistake that I am blindly looking past I would be very appreciative if you could at least tell me which class I am messing up in. I am starting to think that the gui is getting called upon as a regular player inventory but of course it is a furnace gui. as far as I can see all the slots on the furnace gui itself work fine(I am having issues with the fuel working so I can't test the output slot)  But it seems like the slots are off by 6. and when you go far enough to the left it counts back and up a line and grabs the item from there so I can kind of tell that something isn't laid out right. again, any and all input is greatly appreciated! thanks!

 

Main class:

 

 

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
import spartsnicknacks.gui.GuiHandler;
import spartsnicknacks.Event.EventManager;
import spartsnicknacks.Items.Items;
import spartsnicknacks.blocks.Blocks;
import spartsnicknacks.gui.GuiHandler;
import spartsnicknacks.lib.ModInfo;
import spartsnicknacks.lib.Recipes;
import spartsnicknacks.proxies.CommonProxy;
import spartsnicknacks.tileentity.TileEntityPreservebarrel;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
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 = ModInfo.ID, name = ModInfo.NAME, version = ModInfo.VERSION)
@NetworkMod (  clientSideRequired = true, serverSideRequired = true )

public class spartsnicknacks {


@Instance(ModInfo.ID)
public static spartsnicknacks instance;



static EventManager oreManager = new EventManager();

public static final int guiIdPreservebarrel = 0;

GuiHandler guiHandler = new GuiHandler();



@SidedProxy ( clientSide = ModInfo.PROXY_LOCATION + ".ClientProxy", serverSide = ModInfo.PROXY_LOCATION + ".CommonProxy")
public static CommonProxy proxy;

@EventHandler
public  void preInit( FMLPreInitializationEvent event ) {
proxy.initRenderers();
proxy.initSounds();


}

@EventHandler
public  void init( FMLInitializationEvent event ) {
Items.init();
Items.addNames();
Recipes.init();

Blocks.init();
Blocks.addNames();

GameRegistry.registerWorldGenerator(oreManager);

GameRegistry.registerTileEntity(TileEntityPreservebarrel.class, "Preservebarrel");

NetworkRegistry.instance().registerGuiHandler(this, new GuiHandler());

LanguageRegistry.instance().addStringLocalization("container.preserveBarrel", "Preserving Barrel" );

GameRegistry.registerFuelHandler(new FuelHandler());
}



@EventHandler
public static void postInit( FMLPostInitializationEvent event ) {

}

}

 

 

 

 

 

Container class:

 

 

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotFurnace;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import spartsnicknacks.tileentity.TileEntityPreservebarrel;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ContainerPreservebarrel extends Container {


private TileEntityPreservebarrel preserveBarrel;

public int LastburnTime;

public int LastItemBurnTime;

public int LastCookTime;


public ContainerPreservebarrel(InventoryPlayer inventory, TileEntityPreservebarrel tileentity){
	this.preserveBarrel = tileentity;

	this.addSlotToContainer(new Slot(tileentity, 0 , 56, 17));
	this.addSlotToContainer(new Slot(tileentity, 1, 56, 53));
	this.addSlotToContainer(new SlotFurnace(inventory.player, tileentity, 2, 116,35));

	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 9; j++){
			this.addSlotToContainer(new Slot(inventory, j + i*9 + 9, 8 + j*18, 84 + i*18 ));
		}
	}


	for(int i = 0; i < 9; i++){
		this.addSlotToContainer(new Slot(inventory, i, 8 + i*18, 142));
	}
}

public void addCraftingToCrafter(ICrafting icrafting){
	super.addCraftingToCrafters(icrafting);
	icrafting.sendProgressBarUpdate(this, 0, this.preserveBarrel.cookTime);
	icrafting.sendProgressBarUpdate(this, 1, this.preserveBarrel.burnTime);
	icrafting.sendProgressBarUpdate(this, 2, this.preserveBarrel.currentItemBurnTime);
}

public void detectAndSendChanges(){
	super.detectAndSendChanges();
}

@SideOnly(Side.CLIENT)
public void updateProgressBar(int slot, int newValue){
	if(slot == 0) this.preserveBarrel.cookTime = newValue;
	if(slot == 1) this.preserveBarrel.burnTime = newValue;
	if(slot == 2) this.preserveBarrel.currentItemBurnTime = newValue;
}

public ItemStack transferStackInSlot(EntityPlayer player, int slot){
	return null;


}







//this.preserveBarrel.isUseableByPlayer(entityplayer)


public boolean canInteractWith( EntityPlayer entityplayer) {

	return this.preserveBarrel.isUseableByPlayer(entityplayer);
}
}

 

 

 

 

Tile entity class:

 

 

import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import spartsnicknacks.Items.Items;
import spartsnicknacks.blocks.Preservebarrel;
import spartsnicknacks.lib.PbRecipes;
import cpw.mods.fml.common.registry.GameRegistry;

public class TileEntityPreservebarrel extends TileEntity implements ISidedInventory {
private String localizedName;



private static final int[] slots_top = new int[]{0, 1};
private static final int[] slots_bottom = new int[]{2};
private static final int[] slots_sides = new int[]{2};

private ItemStack[] slots = new ItemStack[3];

public int furnaceSpeed = 400;


public int burnTime;

public int currentItemBurnTime;

public int cookTime;



public int getSizeInventory(){
	return this.slots.length;
}

public String getInvName(){
	return this.isInvNameLocalized() ? this.localizedName : "container.preserveBarrel";
}

public boolean isInvNameLocalized(){
	return this.localizedName != null && this.localizedName.length() > 0;

}

public void setGuiDisplayName(String displayName) {
	this.localizedName = displayName;

}


public ItemStack getStackInSlot(int i) {

	return this.slots[i];
}


public ItemStack decrStackSize(int i, int j) {
	if(this.slots[i] != null){
		ItemStack itemstack;

			if(this.slots[i].stackSize <= j){
				itemstack = this.slots[i];
				this.slots[i] = null;
				return itemstack;


			}else{
				itemstack = this.slots[i].splitStack(j);

				if(this.slots[i].stackSize == 0){
					this.slots[i] = null;
				}

				return itemstack;
			}
	}

	return null;
}


public ItemStack getStackInSlotOnClosing(int i) {
	if(this.slots[i] != null){
		ItemStack itemstack = this.slots[i];
		this.slots[i] = null;
		return itemstack;
	}






	return null;
}


public void setInventorySlotContents(int i, ItemStack itemstack) {
	this.slots[i] = itemstack;



	if(itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()){
		itemstack.stackSize = this.getInventoryStackLimit();
	}

}


public int getInventoryStackLimit() {
	return 64;
}


public boolean isUseableByPlayer(EntityPlayer entityplayer) {
	return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0;
}


public void openChest() {

}


public void closeChest() {

}

public boolean isBurning(){
	return this.burnTime > 0;
}



public void updateEntity(){
	boolean flag = this.burnTime > 0;
	boolean flag1 = false;


	if(this.burnTime > 0){
		this.burnTime--;

	}
	if(!this.worldObj.isRemote){
		if(this.burnTime == 0 && this.canSmelt()){
			this.currentItemBurnTime = this.burnTime = getItemBurnTime(this.slots[1]);

			if(this.burnTime > 0){
				flag1 = true;
				if(this.slots[1] != null){
					this.slots[1].stackSize--;

					if(this.slots[1].stackSize == 0){
						this.slots[1] = this.slots[1].getItem().getContainerItemStack(this.slots[1]); 
					}
				}
			}
		}
		if(this.isBurning() && this.canSmelt()){
			this.cookTime++;

			if(this.cookTime == this.furnaceSpeed){
				this.cookTime = 0;
				//this.smeltItem();
				flag1 = true;
			}

		}else{
			this.cookTime = 0;
		}

		if(flag != this.burnTime > 0){
			flag1 = true;
			Preservebarrel.updatePreservebarrelBlockState(this.burnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
		}

	}
	if(flag1){
		this.onInventoryChanged();
	}

}

private boolean canSmelt(){
	if(this.slots[0] == null){
		return false;
	}else{
		ItemStack itemstack = PbRecipes.smelting().getSmeltingResult(slots[0]);

		if(itemstack == null) return false;
		if(this.slots[2] == null) return true;
		if(this.slots[2].isItemEqual(itemstack)) return false;

		int result = this.slots[2].stackSize + itemstack.stackSize;

		return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
	}
}

public void smeltItem(){
	if(this.canSmelt()){
		ItemStack itemstack = PbRecipes.smelting().getSmeltingResult(this.slots[0]);

		if(this.slots[2] == null){
			this.slots[2] = itemstack.copy();

		}else{ if(this.slots[2].isItemEqual(itemstack)){
			this.slots[2].stackSize += itemstack.stackSize;
		}

		this.slots[0].stackSize--;

		if(this.slots[0].stackSize <= 0){
			this.slots[0] = null;
		}
		}


	}
}

public static int getItemBurnTime(ItemStack itemstack){
	if(itemstack == null) { 
			return 0;
	}else{
		int i = itemstack.getItem().itemID;
		Item item = itemstack.getItem();

		if(item instanceof ItemBlock && Block.blocksList[i] != null){
			Block block = Block.blocksList[i];

		}
		//Add Drying salt block								
		//if(i == Blocks.DBS.blockID) return 1800;

		//adding custom fuels
		if(i == Items.DS.itemID) return 200;
			return GameRegistry.getFuelValue(itemstack) ;
	}
}

public static boolean isItemFuel(ItemStack itemstack){
	return getItemBurnTime(itemstack) > 0;
}


public boolean isItemValidForSlot(int i, ItemStack itemstack) {
	return i == 2 ? false : (i == 1 ? isItemFuel(itemstack) : true) ;
}


public int[] getAccessibleSlotsFromSide(int var1) {
	return var1 == 0 ?  slots_bottom : (var1 == 1 ? slots_top : slots_sides);
}


public boolean canInsertItem(int i, ItemStack itemstack, int j) {
	return this.isItemValidForSlot(i, itemstack);
}

public boolean canExtractItem(int i, ItemStack itemstack, int j) {
	return j != 0 || i != 1 || itemstack.itemID == Item.bucketEmpty.itemID;
}

}

 

 

 

Gui class:

 

 

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import spartsnicknacks.Container.ContainerPreservebarrel;
import spartsnicknacks.lib.ModInfo;
import spartsnicknacks.tileentity.TileEntityPreservebarrel;

public class GuiPreservebarrel extends GuiContainer{


public static final ResourceLocation texture = new ResourceLocation(ModInfo.ID.toLowerCase(), "textures/gui/preserveBarrel.png");

public TileEntityPreservebarrel preserveBarrel;


public GuiPreservebarrel(InventoryPlayer inventoryPlayer, TileEntityPreservebarrel entity) {
	super(new ContainerPreservebarrel(inventoryPlayer, entity));

	this.preserveBarrel = entity;

	this.xSize = 176;
	this.ySize = 166;
}


public void drawGuiContainerForegroundlayer(int par1, int par2){
	String name = this.preserveBarrel.isInvNameLocalized() ? this.preserveBarrel.getInvName() : I18n.getString(this.preserveBarrel.getInvName()) ;

	this.fontRenderer.drawString(name, this.xSize / 2 - this.fontRenderer.getStringWidth(name) / 2, 6, 4210752);
	this.fontRenderer.drawString(I18n.getString("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
}

public void drawGuiContainerBackgroundLayer(float f, int i, int j) {
	GL11.glColor4f(1F, 1F, 1F, 1F);

	Minecraft.getMinecraft().getTextureManager().bindTexture(texture);


	drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
}

}

 

 

 

 

GuiHandler:

 

 

import spartsnicknacks.gui.GuiPreservebarrel;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import spartsnicknacks.spartsnicknacks;
import spartsnicknacks.tileentity.TileEntityPreservebarrel;
import cpw.mods.fml.common.network.IGuiHandler;
public class GuiHandler implements IGuiHandler{



public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
TileEntity entity = world.getBlockTileEntity(x, y, z);

if(entity != null){
switch(ID){
case spartsnicknacks.guiIdPreservebarrel:
if (entity instanceof TileEntityPreservebarrel){
return new ContainerPreservebarrel(player.inventory, (TileEntityPreservebarrel) entity);
}
}
}
return null;
}

public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
TileEntity entity = world.getBlockTileEntity(x, y, z);

if(entity != null){
switch(ID){
case spartsnicknacks.guiIdPreservebarrel:
if (entity instanceof TileEntityPreservebarrel){
return new GuiPreservebarrel(player.inventory, (TileEntityPreservebarrel) entity);
}
}
}


return null;
}
}

 

 

Posted

why are you adding 2 slots with the tileentity object and rest(except for playerinv ofc) with the inventory object?

shouldn´t all be tileentity (except for player one)?

Are you referring to this?

 

 

public ContainerPreservebarrel(InventoryPlayer inventory, TileEntityPreservebarrel tileentity){
	this.preserveBarrel = tileentity;

	this.addSlotToContainer(new Slot(tileentity, 0 , 56, 17));
	this.addSlotToContainer(new Slot(tileentity, 1, 56, 53));
	this.addSlotToContainer(new SlotFurnace(inventory.player, tileentity, 2, 116,35));

	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 9; j++){
			this.addSlotToContainer(new Slot(inventory, j + i*9 + 9, 8 + j*18, 84 + i*18 ));
		}
	}


	for(int i = 0; i < 9; i++){
		this.addSlotToContainer(new Slot(inventory, i, 8 + i*18, 142));
	}
}

 

 

because that is something that I have tried playing with, but all of those measurements, and the code itself is actually identical with vanilla code right now. Shouldn't that be right?

 

 

 

 

 

Posted

You never defined the length of furnaceItemStacks

 

Sorry, but where exactly should something like that go? Because like I said earlier, I have ended up replacing a lot of my code with vanilla code just to test and the problem still persists.... sorry for the noob question.

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.