Jump to content

[Solved] How Do I Send Information to the GUI if I use ItemHandlers


Recommended Posts

Posted (edited)

Since I am using ItemHandlers I am not able to communicate using te.getField(int). Please provide an alternative to this problem. My Gui is working properly, just that I am not able to test whether the funace is active or not.

 

TileEntityGemEnchanter.class

public class TileEntityGemEnchanter extends TileEntityBase implements ITickable, ICapabilityProvider {

	private ItemStackHandler inventory = new ItemStackHandler(4);
	private DynamicEnergyStorage energy = new DynamicEnergyStorage(1000000);

	private boolean isEnchanting;

	private int enchantingTime;

	private int currentItemEnchantTime;
	private int enchantTime;
	private int shouldEnchantTime = 50;
	private String enchanterCustomName;
	private int counter = 0;

	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound compound) {
		super.writeToNBT(compound);
		compound.setTag("inventory", inventory.serializeNBT());
		energy.writeToNBT(compound);
		compound.setInteger("enchantTime", this.enchantTime);
		compound.setInteger("currentItemEnchantTime", this.currentItemEnchantTime);
		compound.setInteger("enchantingTime", this.enchantingTime);
		compound.setInteger("shouldEnchantTime", this.shouldEnchantTime);
		compound.setBoolean("isEnchanting", this.isEnchanting);
		if (this.hasCustomName()) {
			compound.setString("enchanterCustomName", this.enchanterCustomName);
		}
		return compound;
	}

	@Override
	public void readFromNBT(NBTTagCompound compound) {
		super.readFromNBT(compound);
		inventory.deserializeNBT(compound.getCompoundTag("inventory"));
		energy.readFromNBT(compound);
		this.enchantTime = compound.getInteger("enchantTime");
		this.currentItemEnchantTime = compound.getInteger("currentItemEnchantTime");
		this.enchantingTime = compound.getInteger("enchantingTime");
		this.shouldEnchantTime = compound.getInteger("shouldEnchantTime");
		this.isEnchanting = compound.getBoolean("isEnchanting");
		if (compound.hasKey("CustomName", 8)) {
			this.enchanterCustomName = compound.getString("CustomName");
		}
	}

	public boolean isEmpty() {
		for (int i = 0; i > this.inventory.getSlots(); i++) {
			if (!this.inventory.getStackInSlot(i).isEmpty()) {
				return false;
			}
		}

		return true;
	}

	public ItemStack decrStackSize(int index, int count) {
		return index >= 0 && index < this.inventory.getSlots()
				&& !((ItemStack) this.inventory.getStackInSlot(index)).isEmpty() && count > 0
						? ((ItemStack) this.inventory.getStackInSlot(index)).splitStack(count)
						: ItemStack.EMPTY;
	}

	public ItemStack removeStackFromSlot(int index) {
		if (index >= 0 && index < this.inventory.getSlots()) {
			this.inventory.setStackInSlot(index, ItemStack.EMPTY);
			return ItemStack.EMPTY;
		}
		return ItemStack.EMPTY;
	}

	public String getName() {
		return this.hasCustomName() ? this.enchanterCustomName : "container.enchanter";
	}

	public boolean hasCustomName() {
		return this.enchanterCustomName != null && !this.enchanterCustomName.isEmpty();
	}

	public void setCustomInventoryName(String name) {
		this.enchanterCustomName = name;
	}

	public void setInventorySlotContents(int index, ItemStack stack) {
		ItemStack itemstack = this.inventory.getStackInSlot(index);
		boolean flag = !stack.isEmpty() && stack.isItemEqual(itemstack)
				&& ItemStack.areItemStackTagsEqual(stack, itemstack);
		this.inventory.setStackInSlot(index, stack);

		if (stack.getCount() > 64) {
			stack.setCount(64);
		}

		if (index == 0 && !flag) {
			this.markDirty();
		}
	}

	public ItemStack getStackInSlot(int index) {
		return this.inventory.getStackInSlot(index);
	}

	@Override
	public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
		return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || capability == CapabilityEnergy.ENERGY
				|| super.hasCapability(capability, facing);
	}

	@Nullable
	@Override
	public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
		if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
			return (T) this.inventory;
		else if (capability == CapabilityEnergy.ENERGY)
			return (T) this.energy;
		else
			return super.getCapability(capability, facing);
	}

	public boolean isEnchanting() {
		return isEnchanting;
	}

	@Override
	public void update() {
		if (!this.world.isRemote) {
			List<EntityItem> items = new ArrayList<EntityItem>();
			items.addAll(world.getEntitiesWithinAABB(EntityItem.class,
					new AxisAlignedBB(pos.add(3, 3, 3), pos.add(-3, -3, -3))));
			for (EntityItem item : items) {
				if (item.getItem().getItem() == Items.STICK) {
					Utils.getLogger().info("Added Power!");
					this.energy.receiveEnergy(1000, false);
				}
			}

			if (this.canSmelt()) {
				this.currentItemEnchantTime = getEnchantTime(this.inventory.getStackInSlot(0),
						this.inventory.getStackInSlot(1));
				this.shouldEnchantTime = this.currentItemEnchantTime;
				this.isEnchanting = true;
				this.smeltItem();
			} else {
				this.enchantTime = 0;
				this.currentItemEnchantTime = 0;
				this.enchantingTime = 0;
				this.shouldEnchantTime = 0;
				this.isEnchanting = false;
			}
		}
		this.markDirty();
	}

	public int getEnchantTime(ItemStack stack, ItemStack stack2) {
		return 50;
	}

	/**
	 * Returns true if the furnace can smelt an item, i.e. has a source item,
	 * destination stack isn't full, etc.
	 */
	private boolean canSmelt() {
		ItemStack slot0 = this.inventory.getStackInSlot(0);
		ItemStack slot1 = this.inventory.getStackInSlot(1);
		ItemStack slot2 = this.inventory.getStackInSlot(2);
		boolean canSmelt = false;

		if (!(slot0.isEmpty() && slot1.isEmpty())) {
			ItemStack recipes = GemEnchanterRecipes.instance().getEnchantingResult(slot0, slot1);
			if (recipes != ItemStack.EMPTY) {
				if (((slot2.getItem() == recipes.getItem()
						&& slot2.getCount() < slot2.getItem().getItemStackLimit(slot2)) || slot2.isEmpty())
						&& this.energy.getEnergyStored() > 10) {
					canSmelt = true;
				}
			}
		}
		return canSmelt;
	}

	public void smeltItem() {
		ItemStack slot0 = this.inventory.getStackInSlot(0);
		ItemStack slot1 = this.inventory.getStackInSlot(1);
		ItemStack result = GemEnchanterRecipes.instance().getEnchantingResult(slot0, slot1);
		ItemStack slot2 = this.inventory.getStackInSlot(2);

		if (this.isEnchanting()) {
			if (this.enchantTime >= this.getShouldEnchantTime()) {
				slot0.shrink(1);
				slot1.shrink(1);
				if (slot2.isEmpty() || slot2.getItem() == Item.getItemFromBlock(Blocks.AIR)) {
					this.inventory.setStackInSlot(2, result.copy());
				} else {
					slot2.grow(result.getCount());
				}
			} else {
				this.enchantTime++;
				this.energy.extractEnergy(10, false);
			}
		}
	}

	public int getEnchantingTime() {
		return this.enchantingTime;
	}

	public void setEnchantingTime(int enchantingTime) {
		this.enchantingTime = enchantingTime;
	}

	public int getCurrentItemEnchantTime() {
		return this.currentItemEnchantTime;
	}

	public void setCurrentItemEnchantTime(int currentItemEnchantTime) {
		this.currentItemEnchantTime = currentItemEnchantTime;
	}

	public int getEnchantTime() {
		return this.enchantTime;
	}

	public void setEnchantTime(int enchantTime) {
		this.enchantTime = enchantTime;
	}

	public int getShouldEnchantTime() {
		return this.shouldEnchantTime;
	}

	public void setShouldEnchantTime(int shouldEnchantTime) {
		this.shouldEnchantTime = shouldEnchantTime;
	}

	public void setEnchanting(boolean isEnchanting) {
		this.isEnchanting = isEnchanting;
	}

	public boolean isItemValidForSlot(int index, ItemStack stack) {
		return index == 1 || index == 2;
	}

}

 

GuiGemEnchanter.class

public class GuiGemEnchanter extends GuiContainer{

	private TileEntityGemEnchanter te;
	private IInventory playerInv;
	
	public GuiGemEnchanter(InventoryPlayer playerInv, TileEntityGemEnchanter te) {
		super(new ContainerGemEnchanter(playerInv, te));
		
		this.xSize = 175;
		this.ySize = 165;
		
		this.te = te;
		this.playerInv = playerInv;
	}

	@Override
	protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
		GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
		this.mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MOD_ID, "textures/gui/container/gem_enchanter.png"));
		this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
		int s = 0;
		if(!this.te.getWorld().isRemote) {
			s = te.getEnchantTime();
			Utils.getLogger().info(te.getEnchantTime());
		}
		if(s > 0) {
			Utils.getLogger().info("Reached here!");
			this.drawTexturedModalRect(79, 34, 176, 14, this.getEnchantedAmount(), 17);
		}
	}
	
	@Override
	protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
		String s = GemEnchantmentMod.proxy.localize(te.getName()); //Gets the formatted name for the block breaker from the language file - NOTE ADD "container.block_breaker=Block Breaker" to the language file (without quotes) and then delete this note
		this.mc.fontRenderer.drawString(s, this.xSize / 2 - this.mc.fontRenderer.getStringWidth(s) / 2, 6, 4210752); 
		this.mc.fontRenderer.drawString(this.playerInv.getDisplayName().getFormattedText(), 8, 72, 4210752);
		super.drawGuiContainerForegroundLayer(mouseX, mouseY);
	}

	private int getEnchantedAmount() {
		int currentItemEnchantAmount = this.te.getCurrentItemEnchantTime();
		int enchantTime = this.te.getEnchantTime();
		float percentage = enchantTime/currentItemEnchantAmount * 100;
		int amount = Math.round(percentage) * 24;
		return amount;
	}
	
}

BlockGemEnchanter.class

ublic class BlockGemEnchanter extends BlockRotatableBase{
	
	public BlockGemEnchanter(Material materialIn, String registryName, float resistance, float hardness,
			Class tileEntity) {
		super(materialIn, registryName, resistance, hardness, tileEntity);
	}
	
	@Override
	public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn,
			EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
		if(!worldIn.isRemote) {
			playerIn.openGui(GemEnchantmentMod.instance, GUI_ID.GEM_ENCHANTER.getGUI_ID(), worldIn, pos.getX(), pos.getY(), pos.getZ());
		}
		return true;
	}

}

 

Edited by DeathSpawn
Posted
13 minutes ago, DeathSpawn said:

Please provide an alternative to this problem.

You can recreate those methods in your te or you could just do te.fieldName

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted (edited)
13 minutes ago, diesieben07 said:

You need to sync fields that are required in the GUI from your container in either case.

Sorry, but I don't understand what this statement means. How am I  supposed to this?

Edited by DeathSpawn
Posted

Packets.

  • Like 1

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

The getField method from Vanilla creates a level abstraction that I don’t think any Modder wants or needs. You should just use getCapability(ItemHandlerCapability) (read more about capabilities here https://mcforge.readthedocs.io/en/latest/datastorage/capabilities/) or a method that returns your ItemStackHandler (you should still be using capabilities, use of a shorthand method is allowable for internal use though). For syncing you just need to override a couple of methods https://mcforge.readthedocs.io/en/latest/tileentities/tileentity/#synchronizing-the-data-to-the-client

  • Like 1

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Posted

Are you syncing (and saving) your data? By default data is not synced to the client.

10 hours ago, Cadiboo said:

 

  • Thanks 1

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Posted
2 minutes ago, Cadiboo said:

Are you syncing (and saving) your data? By default data is not synced to the client.

 

Not now. I am currently trying to do so. This might solve the problem I will update my code and see if it does

 

  • Like 1
Posted
25 minutes ago, DeathSpawn said:

The method has fixed the problem. Should I change the title to [Solved]... or something like that? I am new to the Minecraft Forge forums 

Yeah, just add “[SOLVED] “ to the start of the title (if you want to & if there’s space)

  • Thanks 1

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Posted

For people referring to this in the future, Use these methods used in my case :

 

@Override
	public SPacketUpdateTileEntity getUpdatePacket(){
	    NBTTagCompound nbtTag = new NBTTagCompound();
	    nbtTag.setTag("inventory", inventory.serializeNBT());
		energy.writeToNBT(nbtTag);
		nbtTag.setInteger("enchantTime", this.enchantTime);
		nbtTag.setInteger("currentItemEnchantTime", this.currentItemEnchantTime);
		nbtTag.setInteger("enchantingTime", this.enchantingTime);
		nbtTag.setInteger("shouldEnchantTime", this.shouldEnchantTime);
		nbtTag.setBoolean("isEnchanting", this.isEnchanting);
	    return new SPacketUpdateTileEntity(getPos(), 1, nbtTag);
	}

	@Override
	public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt){
	    NBTTagCompound tag = pkt.getNbtCompound();
	    inventory.deserializeNBT(tag.getCompoundTag("inventory"));
		energy.readFromNBT(tag);
		this.enchantTime = tag.getInteger("enchantTime");
		this.currentItemEnchantTime = tag.getInteger("currentItemEnchantTime");
		this.enchantingTime = tag.getInteger("enchantingTime");
		this.shouldEnchantTime = tag.getInteger("shouldEnchantTime");
		this.isEnchanting = tag.getBoolean("isEnchanting");
	}

 

and also add the following in the update() method:

 

if(this.world.isBlockLoaded(getPos())) { 
	this.world.notifyBlockUpdate(getPos(), this.world.getBlockState(getPos()), this.world.getBlockState(getPos()), 2);
}

 

This should fix the problem I had

  • Like 1

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.