Jump to content

1.6.4 Gui slots not registered correctly


Spartanboy56

Recommended Posts

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;
}
}

 

 

Link to comment
Share on other sites

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?

 

 

 

 

 

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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