Jump to content

Recommended Posts

Posted

Hey all!

 

So I trying to draw a energy Storage bar, and have it insync with the int, I used furnace GUI for example, but my problem is that it draws, but does not change at all based on energy / manual changes.

 

here is the specific part that I need help on

Gui Variables:

final int ENERGY_XPOS = -12;
final int ENERGY_YPOS = 28;
final int ENERGY_ICON_U = 176;   // texture position of energy bar
final int ENERGY_ICON_V = 21;
final int ENERGY_WIDTH = 22;
final int ENERGY_HEIGHT = 80;
final int ENERGY_X_SPACING = 18;

 

Tile Variables:

public int energyDP;
public int energyMax = 5000;
public int energyPerT = 2;
public boolean canAcceptEnergy = true;

 

Code:

double energyRemain = tileEntity.energyDP;
		int energyMax = tileEntity.energyMax;
		int yOffsetEnergy = (int)((energyRemain - energyMax) * ENERGY_HEIGHT); //where im stuck, energy remain should be what, and what should it be modified by
		drawTexturedModalRect(guiLeft + ENERGY_XPOS + ENERGY_X_SPACING, guiTop + ENERGY_YPOS + yOffset,
													ENERGY_ICON_U, ENERGY_ICON_V + yOffset, ENERGY_WIDTH, ENERGY_HEIGHT - yOffset);

Not new to java >> New to modding.

Posted

Hey all!

 

So I trying to draw a energy Storage bar, and have it insync with the int, I used furnace GUI for example, but my problem is that it draws, but does not change at all based on energy / manual changes.

 

here is the specific part that I need help on

Gui Variables:

final int ENERGY_XPOS = -12;
final int ENERGY_YPOS = 28;
final int ENERGY_ICON_U = 176;   // texture position of energy bar
final int ENERGY_ICON_V = 21;
final int ENERGY_WIDTH = 22;
final int ENERGY_HEIGHT = 80;
final int ENERGY_X_SPACING = 18;

 

Tile Variables:

public int energyDP;
public int energyMax = 5000;
public int energyPerT = 2;
public boolean canAcceptEnergy = true;

 

Code:

double energyRemain = tileEntity.energyDP;
		int energyMax = tileEntity.energyMax;
		int yOffsetEnergy = (int)((energyRemain - energyMax) * ENERGY_HEIGHT); //where im stuck, energy remain should be what, and what should it be modified by
		drawTexturedModalRect(guiLeft + ENERGY_XPOS + ENERGY_X_SPACING, guiTop + ENERGY_YPOS + yOffset,
													ENERGY_ICON_U, ENERGY_ICON_V + yOffset, ENERGY_WIDTH, ENERGY_HEIGHT - yOffset);

When do you update energyDP?

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

this:

	for (EnumFacing face : EnumFacing.values()) {
	    BlockPos adj = getPos().offset(face);
	    	if(worldObj.getBlockState(adj).getBlock() == ModBlocks.solarGenerator) {
	    		energyDP++;
	    	}else if(worldObj.getBlockState(adj).getBlock() == null) {
	    		return;
	    	}
		}

 

entire TE for future reference:

 

package com.lambda.PlentifulMisc.blocks.tile;

import net.minecraft.tileentity.TileEntity;

import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.nbt.NBTTagIntArray;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.World;

import javax.annotation.Nullable;

import com.lambda.PlentifulMisc.init.ModBlocks;
import com.lambda.PlentifulMisc.recipe.CraftingHandlerCrystallizer;

import java.util.Arrays;

/**
* User: brandon3055
* Date: 06/01/2015
*
* TileInventorySmelting is an advanced sided inventory that works like a vanilla furnace except that it has 5 input and output slots,
* 4 fuel slots and cooks at up to four times the speed.
* The input slots are used sequentially rather than in parallel, i.e. the first slot cooks, then the second, then the third, etc
* The fuel slots are used in parallel.  The more slots burning in parallel, the faster the cook time.
* The code is heavily based on TileEntityFurnace.
*/
public class TileEnityCrystallizer extends TileEntity implements IInventory, ITickable {
/** Create and initialize the itemStacks variable that will store store the itemStacks */
public static final int FUEL_SLOTS_COUNT = 1;
public static final int INPUT_SLOTS_COUNT = 1;
public static final int OUTPUT_SLOTS_COUNT = 5;
public static final int TOTAL_SLOTS_COUNT = FUEL_SLOTS_COUNT + INPUT_SLOTS_COUNT + OUTPUT_SLOTS_COUNT;

public static final int FIRST_FUEL_SLOT = 0;
public static final int FIRST_INPUT_SLOT = FIRST_FUEL_SLOT + FUEL_SLOTS_COUNT;
public static final int FIRST_OUTPUT_SLOT = FIRST_INPUT_SLOT + INPUT_SLOTS_COUNT;

private ItemStack[] itemStacks = new ItemStack[TOTAL_SLOTS_COUNT];

/** The number of burn ticks remaining on the current piece of fuel */
public int energyDP;
public int energyMax = 5000;
public int energyPerT = 2;
public int energyReceivedT = 1;
public boolean canAcceptEnergy = true;
/** The initial fuel value of the currently burning fuel (in ticks of burn duration) */
private int [] energyInitial = new int[FUEL_SLOTS_COUNT];

/**The number of ticks the current item has been cooking*/
private short cookTime;
/**The number of ticks required to cook an item*/
private static final short COOK_TIME_FOR_COMPLETION = 100;  // vanilla value is 200 = 10 seconds

private int cachedNumberOfBurningSlots = -1;

/**
 * Returns the amount of fuel remaining on the currently burning item in the given fuel slot.
 * @fuelSlot the number of the fuel slot (0..3)
 * @return fraction remaining, between 0 - 1
 */
public double fractionOfFuelRemaining(int fuelSlot)
{
	if (energyInitial[fuelSlot] <= 0 ) return 0;
	double fraction = energyDP / (double)energyDP;
	return MathHelper.clamp_double(fraction, 0.0, 1.0);
}

/**
 * return the remaining burn time of the fuel in the given slot
 * @param fuelSlot the number of the fuel slot (0..3)
 * @return seconds remaining
 */
public int secondsOfFuelRemaining(int fuelSlot)
{
	if (energyDP <= 0 ) return 0;
	return energyDP / 20; // 20 ticks per second
}

/**
 * Get the number of slots which have fuel burning in them.
 * @return number of slots with burning fuel, 0 - FUEL_SLOTS_COUNT
 */

/**
 * Returns the amount of cook time completed on the currently cooking item.
 * @return fraction remaining, between 0 - 1
 */
public double fractionOfCookTimeComplete()
{
	double fraction = cookTime / (double)COOK_TIME_FOR_COMPLETION;
	return MathHelper.clamp_double(fraction, 0.0, 1.0);
}

// This method is called every tick to update the tile entity, i.e.
// - see if the fuel has run out, and if so turn the furnace "off" and slowly uncook the current item (if any)
// - see if any of the items have finished smelting
// It runs both on the server and the client.
@Override
public void update() {
	// If there is nothing to smelt or there is no room in the output, reset cookTime and return
	if (canSmelt()) {
		int energyStored = burnFuel();

		// If fuel is available, keep cooking the item, otherwise start "uncooking" it at double speed
		if (energyStored > 0) {
			cookTime += energyStored;
		}	else {
			cookTime -= 1;
		}
		if (cookTime < 0) cookTime = 0;

		// If cookTime has reached maxCookTime smelt the item and reset cookTime
		if (cookTime >= COOK_TIME_FOR_COMPLETION) {
			smeltItem();
			cookTime = 0;
		}
	}	else {
		cookTime = 0;
	}


	if(energyDP >= energyMax) {
		energyDP = energyMax;
		canAcceptEnergy = false;
	}else {
		canAcceptEnergy = true;
	}

	// when the number of burning slots changes, we need to force the block to re-render, otherwise the change in
	//   state will not be visible.  Likewise, we need to force a lighting recalculation.
	// The block update (for renderer) is only required on client side, but the lighting is required on both, since
	//    the client needs it for rendering and the server needs it for crop growth etc

	for (EnumFacing face : EnumFacing.values()) {
	    BlockPos adj = getPos().offset(face);
	    	if(worldObj.getBlockState(adj).getBlock() == ModBlocks.solarGenerator) {
	    		energyDP++;
	    	}else if(worldObj.getBlockState(adj).getBlock() == null) {
	    		return;
	    	}
		}

	if (worldObj.isRemote) {
        IBlockState iblockstate = this.worldObj.getBlockState(pos);
        final int FLAGS = 3;  // I'm not sure what these flags do, exactly.
        worldObj.notifyBlockUpdate(pos, iblockstate, iblockstate, FLAGS);
		}
		worldObj.checkLightFor(EnumSkyBlock.BLOCK, pos);
	}

/**
 * 	for each fuel slot: decreases the burn time, checks if burnTimeRemaining = 0 and tries to consume a new piece of fuel if one is available
 * @return the number of fuel slots which are burning
 */

private int burnFuel() {
	int burningCount = 0;
		int fuelSlotNumber = FIRST_FUEL_SLOT;
		if (energyDP > 0) {
			energyDP -= energyPerT;
			++burningCount;
		if (energyDP == 0) {
				energyDP = energyInitial[0] = getItemBurnTime(itemStacks[fuelSlotNumber]);
				++burningCount;
			}
		}
	markDirty();
	return burningCount;
}
/**
 * Check if any of the input items are smeltable and there is sufficient space in the output slots
 * @return true if smelting is possible
 */
private boolean canSmelt() {return smeltItem(false);}

/**
 * Smelt an input item into an output slot, if possible
 */
private void smeltItem() {smeltItem(true);}

/**
 * checks that there is an item to be smelted in one of the input slots and that there is room for the result in the output slots
 * If desired, performs the smelt
 * @param performSmelt if true, perform the smelt.  if false, check whether smelting is possible, but don't change the inventory
 * @return false if no items can be smelted, true otherwise
 */
private boolean smeltItem(boolean performSmelt)
{
	Integer firstSuitableInputSlot = null;
	Integer firstSuitableOutputSlot = null;
	ItemStack result = null;

	// finds the first input slot which is smeltable and whose result fits into an output slot (stacking if possible)
	for (int inputSlot = FIRST_INPUT_SLOT; inputSlot < FIRST_INPUT_SLOT + INPUT_SLOTS_COUNT; inputSlot++)	{
		if (itemStacks[inputSlot] != null) {
			result = getSmeltingResultForItem(itemStacks[inputSlot]);
  			if (result != null) {
				// find the first suitable output slot- either empty, or with identical item that has enough space
				for (int outputSlot = FIRST_OUTPUT_SLOT; outputSlot < FIRST_OUTPUT_SLOT + OUTPUT_SLOTS_COUNT; outputSlot++) {
					ItemStack outputStack = itemStacks[outputSlot];
					if (outputStack == null) {
						firstSuitableInputSlot = inputSlot;
						firstSuitableOutputSlot = outputSlot;
						break;
					}

					if (outputStack.getItem() == result.getItem() && (!outputStack.getHasSubtypes() || outputStack.getMetadata() == outputStack.getMetadata())
									&& ItemStack.areItemStackTagsEqual(outputStack, result)) {
						int combinedSize = itemStacks[outputSlot].stackSize + result.stackSize;
						if (combinedSize <= getInventoryStackLimit() && combinedSize <= itemStacks[outputSlot].getMaxStackSize()) {
							firstSuitableInputSlot = inputSlot;
							firstSuitableOutputSlot = outputSlot;
							break;
						}
					}
				}
				if (firstSuitableInputSlot != null) break;
			}
		}
	}

	if (firstSuitableInputSlot == null) return false;
	if (!performSmelt) return true;

	// alter input and output
	itemStacks[firstSuitableInputSlot].stackSize--;
	if (itemStacks[firstSuitableInputSlot].stackSize <=0) itemStacks[firstSuitableInputSlot] = null;
	if (itemStacks[firstSuitableOutputSlot] == null) {
		itemStacks[firstSuitableOutputSlot] = result.copy(); // Use deep .copy() to avoid altering the recipe
	} else {
		itemStacks[firstSuitableOutputSlot].stackSize += result.stackSize;
	}
	markDirty();
	return true;
}

// returns the smelting result for the given stack. Returns null if the given stack can not be smelted
public static ItemStack getSmeltingResultForItem(ItemStack stack) { return CraftingHandlerCrystallizer.instance().getSmeltingResult(stack); }

// returns the number of ticks the given item will burn. Returns 0 if the given item is not a valid fuel
	public static short getItemBurnTime(ItemStack stack)
	{
		int burntime = TileEntityFurnace.getItemBurnTime(stack);  // just use the vanilla values
		return (short)MathHelper.clamp_int(burntime, 0, Short.MAX_VALUE);
	}

	// Gets the number of slots in the inventory
	@Override
	public int getSizeInventory() {
		return itemStacks.length;
	}

	// Gets the stack in the given slot
	@Override
	public ItemStack getStackInSlot(int i) {
		return itemStacks[i];
	}

	/**
	 * Removes some of the units from itemstack in the given slot, and returns as a separate itemstack
	 * @param slotIndex the slot number to remove the items from
	 * @param count the number of units to remove
	 * @return a new itemstack containing the units removed from the slot
	 */
	@Override
	public ItemStack decrStackSize(int slotIndex, int count) {
		ItemStack itemStackInSlot = getStackInSlot(slotIndex);
		if (itemStackInSlot == null) return null;

		ItemStack itemStackRemoved;
		if (itemStackInSlot.stackSize <= count) {
			itemStackRemoved = itemStackInSlot;
			setInventorySlotContents(slotIndex, null);
		} else {
			itemStackRemoved = itemStackInSlot.splitStack(count);
			if (itemStackInSlot.stackSize == 0) {
				setInventorySlotContents(slotIndex, null);
			}
		}
		markDirty();
		return itemStackRemoved;
	}

	// overwrites the stack in the given slotIndex with the given stack
	@Override
	public void setInventorySlotContents(int slotIndex, ItemStack itemstack) {
		itemStacks[slotIndex] = itemstack;
		if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) {
			itemstack.stackSize = getInventoryStackLimit();
		}
		markDirty();
	}

	// This is the maximum number if items allowed in each slot
	// This only affects things such as hoppers trying to insert items you need to use the container to enforce this for players
	// inserting items via the gui
	@Override
	public int getInventoryStackLimit() {
		return 64;
	}

	// Return true if the given player is able to use this block. In this case it checks that
	// 1) the world tileentity hasn't been replaced in the meantime, and
	// 2) the player isn't too far away from the centre of the block
	@Override
	public boolean isUseableByPlayer(EntityPlayer player) {
		if (this.worldObj.getTileEntity(this.pos) != 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.getDistanceSq(pos.getX() + X_CENTRE_OFFSET, pos.getY() + Y_CENTRE_OFFSET, pos.getZ() + Z_CENTRE_OFFSET) < MAXIMUM_DISTANCE_SQ;
	}

	// Return true if the given stack is allowed to be inserted in the given slot
	// Unlike the vanilla furnace, we allow anything to be placed in the fuel slots
	static public boolean isItemValidForFuelSlot(ItemStack itemStack)
	{
		return true;
	}

	// Return true if the given stack is allowed to be inserted in the given slot
	// Unlike the vanilla furnace, we allow anything to be placed in the fuel slots
	static public boolean isItemValidForInputSlot(ItemStack itemStack)
	{
		return true;
	}

	// Return true if the given stack is allowed to be inserted in the given slot
	// Unlike the vanilla furnace, we allow anything to be placed in the fuel slots
	static public boolean isItemValidForOutputSlot(ItemStack itemStack)
	{
		return false;
	}

	//------------------------------

	// This is where you save any data that you don't want to lose when the tile entity unloads
	// In this case, it saves the state of the furnace (burn time etc) and the itemstacks stored in the fuel, input, and output slots
	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound parentNBTTagCompound)
	{
		super.writeToNBT(parentNBTTagCompound); // The super call is required to save and load the tiles location

//			// Save the stored item stacks

		// to use an analogy with Java, this code generates an array of hashmaps
		// The itemStack in each slot is converted to an NBTTagCompound, which is effectively a hashmap of key->value pairs such
		//   as slot=1, id=2353, count=1, etc
		// Each of these NBTTagCompound are then inserted into NBTTagList, which is similar to an array.
		NBTTagList dataForAllSlots = new NBTTagList();
		for (int i = 0; i < this.itemStacks.length; ++i) {
			if (this.itemStacks[i] != null) {
				NBTTagCompound dataForThisSlot = new NBTTagCompound();
				dataForThisSlot.setByte("Slot", (byte) i);
				this.itemStacks[i].writeToNBT(dataForThisSlot);
				dataForAllSlots.appendTag(dataForThisSlot);
			}
		}
		// the array of hashmaps is then inserted into the parent hashmap for the container
		parentNBTTagCompound.setTag("Items", dataForAllSlots);

		// Save everything else
		parentNBTTagCompound.setShort("CookTime", cookTime);
		parentNBTTagCompound.setTag("energyRemaining", new NBTTagInt(energyDP));
		parentNBTTagCompound.setTag("energyInitial", new NBTTagIntArray(energyInitial));
    return parentNBTTagCompound;
	}

	// This is where you load the data that you saved in writeToNBT
	@Override
	public void readFromNBT(NBTTagCompound nbtTagCompound)
	{
		super.readFromNBT(nbtTagCompound); // The super call is required to save and load the tiles location
		final byte NBT_TYPE_COMPOUND = 10;       // See NBTBase.createNewByType() for a listing
		NBTTagList dataForAllSlots = nbtTagCompound.getTagList("Items", NBT_TYPE_COMPOUND);

		Arrays.fill(itemStacks, null);           // set all slots to empty
		for (int i = 0; i < dataForAllSlots.tagCount(); ++i) {
			NBTTagCompound dataForOneSlot = dataForAllSlots.getCompoundTagAt(i);
			byte slotNumber = dataForOneSlot.getByte("Slot");
			if (slotNumber >= 0 && slotNumber < this.itemStacks.length) {
				this.itemStacks[slotNumber] = ItemStack.loadItemStackFromNBT(dataForOneSlot);
			}
		}

		// Load everything else.  Trim the arrays (or pad with 0) to make sure they have the correct number of elements
		cookTime = nbtTagCompound.getShort("CookTime");
		energyDP = nbtTagCompound.getInteger("energyRemaining");
		energyInitial = Arrays.copyOf(nbtTagCompound.getIntArray("energyInitial"), FUEL_SLOTS_COUNT);
		cachedNumberOfBurningSlots = -1;
	}

//		// When the world loads from disk, the server needs to send the TileEntity information to the client
//		//  it uses getUpdatePacket(), getUpdateTag(), onDataPacket(), and handleUpdateTag() to do this
  @Override
  @Nullable
  public SPacketUpdateTileEntity getUpdatePacket()
  {
    NBTTagCompound updateTagDescribingTileEntityState = getUpdateTag();
    final int METADATA = 0;
    return new SPacketUpdateTileEntity(this.pos, METADATA, updateTagDescribingTileEntityState);
  }

  @Override
  public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
    NBTTagCompound updateTagDescribingTileEntityState = pkt.getNbtCompound();
    handleUpdateTag(updateTagDescribingTileEntityState);
  }

  /* Creates a tag containing the TileEntity information, used by vanilla to transmit from server to client
     Warning - although our getUpdatePacket() uses this method, vanilla also calls it directly, so don't remove it.
   */
  @Override
  public NBTTagCompound getUpdateTag()
  {
		NBTTagCompound nbtTagCompound = new NBTTagCompound();
		writeToNBT(nbtTagCompound);
    return nbtTagCompound;
  }

  /* Populates this TileEntity with information from the tag, used by vanilla to transmit from server to client
   Warning - although our onDataPacket() uses this method, vanilla also calls it directly, so don't remove it.
 */
  @Override
  public void handleUpdateTag(NBTTagCompound tag)
  {
    this.readFromNBT(tag);
  }
  //------------------------

	// set all slots to empty
	@Override
	public void clear() {
		Arrays.fill(itemStacks, null);
	}

	// will add a key for this container to the lang file so we can name it in the GUI
	@Override
	public String getName() {
		return "container.crystallizer.name";
	}

	@Override
	public boolean hasCustomName() {
		return false;
	}

	// standard code to look up what the human-readable name is
  @Nullable
  @Override
  public ITextComponent getDisplayName() {
		return this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName());
	}

	// Fields are used to send non-inventory information from the server to interested clients
	// The container code caches the fields and sends the client any fields which have changed.
	// The field ID is limited to byte, and the field value is limited to short. (if you use more than this, they get cast down
	//   in the network packets)
	// If you need more than this, or shorts are too small, use a custom packet in your container instead.

	private static final byte COOK_FIELD_ID = 0;
	private static final byte FIRST_BURN_TIME_REMAINING_FIELD_ID = 1;
	private static final byte FIRST_BURN_TIME_INITIAL_FIELD_ID = FIRST_BURN_TIME_REMAINING_FIELD_ID + (byte)FUEL_SLOTS_COUNT;
	private static final byte NUMBER_OF_FIELDS = FIRST_BURN_TIME_INITIAL_FIELD_ID + (byte)FUEL_SLOTS_COUNT;

	@Override
	public int getField(int id) {
		if (id == COOK_FIELD_ID) return cookTime;
		if (id >= FIRST_BURN_TIME_REMAINING_FIELD_ID && id < FIRST_BURN_TIME_REMAINING_FIELD_ID + FUEL_SLOTS_COUNT) {
			return energyDP;
		}
		if (id >= FIRST_BURN_TIME_INITIAL_FIELD_ID && id < FIRST_BURN_TIME_INITIAL_FIELD_ID + FUEL_SLOTS_COUNT) {
			return energyInitial[id - FIRST_BURN_TIME_INITIAL_FIELD_ID];
		}
		System.err.println("Invalid field ID in TileInventorySmelting.getField:" + id);
		return 0;
	}

	@Override
	public void setField(int id, int value)
	{
		if (id == COOK_FIELD_ID) {
			cookTime = (short)value;
		} else if (id >= FIRST_BURN_TIME_REMAINING_FIELD_ID && id < FIRST_BURN_TIME_REMAINING_FIELD_ID + FUEL_SLOTS_COUNT) {
			energyDP = value;
		} else if (id >= FIRST_BURN_TIME_INITIAL_FIELD_ID && id < FIRST_BURN_TIME_INITIAL_FIELD_ID + FUEL_SLOTS_COUNT) {
			energyInitial[id - FIRST_BURN_TIME_INITIAL_FIELD_ID] = value;
		} else {
			System.err.println("Invalid field ID in TileInventorySmelting.setField:" + id);
		}
	}

	@Override
	public int getFieldCount() {
		return NUMBER_OF_FIELDS;
	}

	@Override
	public boolean isItemValidForSlot(int slotIndex, ItemStack itemstack) {
		return false;
	}

	/**
	 * This method removes the entire contents of the given slot and returns it.
	 * Used by containers such as crafting tables which return any items in their slots when you close the GUI
	 * @param slotIndex
	 * @return
	 */
	@Override
	public ItemStack removeStackFromSlot(int slotIndex) {
		ItemStack itemStack = getStackInSlot(slotIndex);
		if (itemStack != null) setInventorySlotContents(slotIndex, null);
		return itemStack;
	}

	@Override
	public void openInventory(EntityPlayer player) {}

	@Override
	public void closeInventory(EntityPlayer player) {}

}

 

and GUI

 

package com.lambda.PlentifulMisc.client.gui;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

import com.lambda.PlentifulMisc.blocks.container.ContainerCrystallizer;
import com.lambda.PlentifulMisc.blocks.tile.TileEnityCrystallizer;

/**
* User: brandon3055
* Date: 06/01/2015
*
* GuiInventoryAdvanced is a gui similar to that of a furnace. It has a progress bar and a burn time indicator.
* Both indicators have mouse over text
*/
@SideOnly(Side.CLIENT)
public class GuiCrystallizer extends GuiContainer {

// This is the resource location for the background image
private static final ResourceLocation texture = new ResourceLocation("plentifulmisc", "textures/gui/guiCrystallizer.png");
private TileEnityCrystallizer tileEntity;

public GuiCrystallizer(InventoryPlayer invPlayer, TileEnityCrystallizer tileInventoryFurnace) {
	super(new ContainerCrystallizer(invPlayer, tileInventoryFurnace));

	// Set the width and height of the gui
	xSize = 176;
	ySize = 207;

	this.tileEntity = tileInventoryFurnace;
}

// some [x,y] coordinates of graphical elements
final int COOK_BAR_XPOS = 49;
final int COOK_BAR_YPOS = 60;
final int COOK_BAR_ICON_U = 0;   // texture position of white arrow icon
final int COOK_BAR_ICON_V = 207;
final int COOK_BAR_WIDTH = 80;
final int COOK_BAR_HEIGHT = 17;

final int FLAME_XPOS = 54;
final int FLAME_YPOS = 80;
final int FLAME_ICON_U = 178;   // texture position of flame icon
final int FLAME_ICON_V = 0;
final int FLAME_WIDTH = 9;
final int FLAME_HEIGHT = 15;
final int FLAME_X_SPACING = 18;

final int ENERGY_XPOS = -12;
final int ENERGY_YPOS = 28;
final int ENERGY_ICON_U = 176;   // texture position of energy bar
final int ENERGY_ICON_V = 21;
final int ENERGY_WIDTH = 22;
final int ENERGY_HEIGHT = 80;
final int ENERGY_X_SPACING = 18;

@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int x, int y) {
	// Bind the image texture
	Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
	// Draw the image
	GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
	drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);

	// get cook progress as a double between 0 and 1
	double cookProgress = tileEntity.fractionOfCookTimeComplete();
	// draw the cook progress bar
	drawTexturedModalRect(guiLeft + COOK_BAR_XPOS, guiTop + COOK_BAR_YPOS, COOK_BAR_ICON_U, COOK_BAR_ICON_V,
					              (int)(cookProgress * COOK_BAR_WIDTH), COOK_BAR_HEIGHT);

	// draw the fuel remaining bar for each fuel slot flame
		double burnRemaining = tileEntity.fractionOfFuelRemaining(0);
		int yOffset = (int)((1.0 - burnRemaining) * FLAME_HEIGHT);
		drawTexturedModalRect(guiLeft + FLAME_XPOS + FLAME_X_SPACING, guiTop + FLAME_YPOS + yOffset,
													FLAME_ICON_U, FLAME_ICON_V + yOffset, FLAME_WIDTH, FLAME_HEIGHT - yOffset);
		// draw energy bar

		double energyRemain = tileEntity.energyDP;
		int energyMax = tileEntity.energyMax;
		int yOffsetEnergy = (int)((energyRemain - energyMax) * ENERGY_HEIGHT);
		drawTexturedModalRect(guiLeft + ENERGY_XPOS + ENERGY_X_SPACING, guiTop + ENERGY_YPOS + yOffset,
													ENERGY_ICON_U, ENERGY_ICON_V + yOffset, ENERGY_WIDTH, ENERGY_HEIGHT - yOffset);
}

@Override
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
	super.drawGuiContainerForegroundLayer(mouseX, mouseY);

	final int LABEL_XPOS = 5;
	final int LABEL_YPOS = 5;
	fontRendererObj.drawString(tileEntity.getDisplayName().getUnformattedText(), LABEL_XPOS, LABEL_YPOS, Color.darkGray.getRGB());

	List<String> hoveringText = new ArrayList<String>();

	// If the mouse is over the progress bar add the progress bar hovering text
	if (isInRect(guiLeft + COOK_BAR_XPOS, guiTop + COOK_BAR_YPOS, COOK_BAR_WIDTH, COOK_BAR_HEIGHT, mouseX, mouseY)){
		hoveringText.add("Progress:");
		int cookPercentage =(int)(tileEntity.fractionOfCookTimeComplete() * 100);
		hoveringText.add(cookPercentage + "%");
	}

	// If the mouse is over one of the burn time indicator add the burn time indicator hovering text
	for (int i = 0; i < tileEntity.FUEL_SLOTS_COUNT; ++i) {
		if (isInRect(guiLeft + FLAME_XPOS + FLAME_X_SPACING * i, guiTop + FLAME_YPOS, FLAME_WIDTH, FLAME_HEIGHT, mouseX, mouseY)) {
			hoveringText.add("Fuel Time:");
			hoveringText.add(tileEntity.secondsOfFuelRemaining(i) + "s");
		}
	}
		if (isInRect(guiLeft + ENERGY_XPOS + ENERGY_X_SPACING, guiTop + ENERGY_YPOS, ENERGY_WIDTH, ENERGY_HEIGHT, mouseX, mouseY)) {
			hoveringText.add("Energy Amount:");
			hoveringText.add(tileEntity.energyDP + " DP");
		}

	// If hoveringText is not empty draw the hovering text
	if (!hoveringText.isEmpty()){
		drawHoveringText(hoveringText, mouseX - guiLeft, mouseY - guiTop, fontRendererObj);
	}
//		// You must re bind the texture and reset the colour if you still need to use it after drawing a string
//		Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
//		GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);

}

// Returns true if the given x,y coordinates are within the given rectangle
public static boolean isInRect(int x, int y, int xSize, int ySize, int mouseX, int mouseY){
	return ((mouseX >= x && mouseX <= x+xSize) && (mouseY >= y && mouseY <= y+ySize));
}
}

 

It does update its self with the hover function.

Not new to java >> New to modding.

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

    • My apologies, it's a Postscript. I was able to play for an extended period of time right after generating the world without any problems. If I close it and reopen it, I get that message at random. Once it appears, I have to modify the Level.dat to open it.
    • Share logs/errors, and someone may know how to help. Make sure to read the FAQ on sharing logs.
    • Hello.  regarding Invalid player data.  First of all, my English is not good, so there might be mistakes. I am using Minecraft 1.20.1 forge 47.3.22 CurseForge and have over 250 mods in my modpack. Single-player. I can play the game after generating the world (about 5 hours) and restarting it, but there is no set timing and one day it suddenly shows ''Invalid player data''. Restarted the game several times after that, but the same message appears. Fix the level.dat file and play for a few hours, but the next day when I try to open the world I get the ''Invalid player data'' message again. Can open other worlds, but after some progress in the other worlds, the same message appears and I can't start them. Is there something wrong with the mod configuration? I would be very grateful if you could tell me how to solve this problem. ◉ErrorCode https://mclo.gs/4gcfPbY   ◉ModList AdvancementPlaques-forge-1.6.9.jar AI-Improvements-1.20-0.5.2.jar alexsmobs-1.22.9.jar alternate_current-mc1.20-1.7.0.jar AmbientSounds_FORGE_v6.1.6_mc1.20.1.jar amendments-1.20-1.2.18.jar Apotheosis-1.20.1-7.4.6.jar ApothicAttributes-1.20.1-1.3.7.jar appleskin-forge-mc1.20.1-2.5.1.jar aquamirae-6.API15.jar architectury-9.2.14-forge.jar ars_elemental-1.20.1-0.6.7.7.jar ars_extended_glyphs-1.20.1-1.9.jar ars_nouveau-1.20.1-4.12.6-all.jar AttributeFix-Forge-1.20.1-21.0.4.jar azurelib-neo-1.20.1-2.0.41.jar BadOptimizations-2.2.1-1.20.1.jar balm-forge-1.20.1-7.3.16-all.jar barbequesdelight-1.0.5.jar BattleArts-20.9.7.1.jar BattleArtsAPI-20.9.5.3.jar BEB-Forge-1.20.1-2.0.0.jar bendy-lib-forge-4.0.0.jar betterendcities-1.0.0-1.20.1.jar betterfpsdist-1.20.1-6.0.jar BetterThirdPerson-Forge-1.20-1.9.0.jar bettervillage-forge-1.20.1-3.2.0.jar biggerendcities-1.20.1-1.0.0.jar blockui-1.20.1-1.0.156-RELEASE.jar blueprint-1.20.1-7.1.1.jar blur-forge-3.1.1.jar BOMD-Forge-1.20.1-1.1.1.jar Bookshelf-Forge-1.20.1-20.2.13.jar BrewinAndChewin-1.20.1-3.1.2.jar BridgingMod-2.5.1+1.20.1.forge-release.jar caelus-forge-3.2.0+1.20.1.jar CarbonConfig-1.20-1.2.6.jar Cardiac-FORGE-0.5.3.2+1.20.1.jar carryon-forge-1.20.1-2.1.2.7.jar casualness_delight-1.20.1-0.4n.jar CerbonsApi-Forge-1.20.1-1.0.0.jar chat_heads-0.13.13-forge-1.20.jar cherishedworlds-forge-6.1.7+1.20.1.jar ChoiceTheorem's Overhauled Village-3.4.11.jar Chunk-Pregenerator-1.20-4.4.4.jar citadel-2.6.1-1.20.1.jar clean_tooltips-1.0-forge-1.20.1.jar cloth-config-11.1.136-forge.jar Clumps-forge-1.20.1-12.0.0.4.jar cobweb-forge-1.20.1-1.0.1.jar CocoaInput-1.20.5-fabric-4.4.1-EXPERIMENTAL.jar collective-1.20.1-7.91.jar cosmeticarmorreworked-1.20.1-v1a.jar create-1.20.1-0.5.1.j.jar create_easy_structures-0.1.2-forge-1.20.1.jar CreativeCore_FORGE_v2.12.31_mc1.20.1.jar creeperoverhaul-3.0.2-forge.jar cristellib-1.1.6-forge.jar cuisinedelight-1.1.16.jar cupboard-1.20.1-2.7.jar curios-forge-5.11.1+1.20.1.jar CutAllSMP_v2.5.2.jar default_skill_trees-1.1.jar DisenchantmentEditTable-1.20-1.1.2.jar DistantHorizons-2.2.1-a-1.20.1-forge-fabric.jar domesticationinnovation-1.7.1-1.20.1.jar domum_ornamentum-1.20.1-1.0.186-RELEASE-universal.jar dragonitegear-0.3.2.jar Dungeon Crawl-1.20.1-2.3.15.jar dungeons-and-taverns-ancient-city-overhaul-1 [Forge].jar DungeonsArise-1.20.x-2.1.58-release.jar dungeons_enhanced-1.20.1-5.3.0.jar dungeons_plus-1.20.1-1.5.0.jar ec_isasb_plugin-1.20.1-1.0.0-all.jar efiscompat-2.2.4.jar EFMCompat 20.2.0.1.jar embeddium-0.3.31+mc1.20.1.jar EnchantmentDescriptions-Forge-1.20.1-17.1.19.jar endermanoverhaul-forge-1.20.1-1.0.4.jar EnderWyrmlings-1.0.0-forge-1.20.1.jar endrem_forge-5.3.3-R-1.20.1.jar enhanced_boss_bars-1.20.1-1.0.0.jar entityculling-forge-1.7.2-mc1.20.1.jar entity_model_features_forge_1.20.1-2.4.1.jar entity_texture_features_forge_1.20.1-6.2.9.jar Epic-Knights-9.21.jar Epic-Knights-Addon-1.22.jar Epic-Knights-Slavic-Armory-1.5.jar epicfight-forge-20.9.7-1.20.1.jar essential_1-3-5-7_forge_1-20-1.jar ExCap-20.9.7.3.jar exoticbirds-1.20.1-1.0.0.jar expanded_combat-1.20.1-3.2.4-all.jar Explorify v1.6.2 f10-48.jar extrasounds-1.20.1-forge-1.3.jar falchionmoveset-20.8.2.jar Fallingleaves-1.20.1-2.1.0.jar FarmersDelight-1.20.1-1.2.7.jar farsight-1.20.1-3.7.jar FastFurnace-1.20.1-8.0.2.jar FastSuite-1.20.1-5.0.1.jar FastWorkbench-1.20.1-8.0.4.jar ferritecore-6.0.1-forge.jar forge-medievalend-1.0.1.jar framework-forge-1.20.1-0.7.12.jar frozen_zombie_castle-1.4.0-forge-1.20.1.jar fzzy_config-0.6.4+1.20.1+forge.jar geckolib-forge-1.20.1-4.7.jar globalxp-forge-1.20.1-1.12.jar goblintraders-forge-1.20.1-1.9.3.jar gravestone-forge-1.20.1-1.0.24.jar guardvillagers-1.20.1-1.6.10.jar harvest-with-ease-forge-1.20.1-9.4.0.jar Highlighter-1.20.1-forge-1.1.9.jar hole_filler_mod-1.2.8_mc-1.20.1_forge.jar Iceberg-1.20.1-forge-1.1.25.jar ImmediatelyFast-Forge-1.3.4+1.20.4.jar ImmersiveUI-FORGE-0.3.0.jar imst-2.1.0.jar infernalmobs-1.20.1.6.jar integrated_api-1.5.1+1.20.1-forge.jar integrated_villages-1.1.5+1.20.1-forge.jar inventoryhud.forge.1.20.1-3.4.26.jar InventoryProfilesNext-forge-1.20-1.10.14.jar inventorysorter-1.20.1-23.0.8.jar InventorySpam-1.20.1-1.5.6.jar ironchest-1.20.1-14.4.4.jar irons_spellbooks-1.20.1-3.4.0.7.jar iron_repair_kits-2.4.3-forge-1.20.1.jar ItemBorders-1.20.1-forge-1.2.2.jar ItemProductionLib-1.20.1-1.0.2a-all.jar Jade-1.20.1-Forge-11.12.3.jar jei-1.20.1-forge-15.20.0.106.jar journeymap-1.20.1-5.10.3-forge.jar justhammers-forge-2.0.3+mc1.20.1.jar Kobolds-2.12.0.jar kotlinforforge-4.11.0-all.jar LegendaryTooltips-1.20.1-forge-1.4.5.jar libIPN-forge-1.20-4.0.2.jar libraryferret-forge-1.20.1-4.0.0.jar lionfishapi-2.4-Fix.jar lithostitched-forge-1.20.1-1.4.4.jar lmft-1.0.4+1.20.1-forge.jar lootbeams-1.20.1-1.2.6.jar lootintegrations-1.20.1-4.0.jar lukis-grand-capitals-1.1.1.jar L_Enders_Cataclysm-2.54- 1.20.1.jar mes-1.3.4-1.20-forge.jar mexicans_delight-1.1.1-forge-1.20.1.jar MineAllSMP_v2.6.6.jar minecolonies-1.20.1-1.1.814-snapshot.jar mna-forge-1.20.1-3.1.0.4-all.jar modernfix-forge-5.20.2+mc1.20.1.jar ModernUI-Forge-1.20.1-3.11.1.6-universal.jar modlist.txt moonlight-1.20-2.13.65-forge.jar mowziesmobs-1.7.0.jar multipiston-1.20-1.2.43-RELEASE.jar MutantMonsters-v8.0.7-1.20.1-Forge.jar mutil-1.20.1-6.1.1.jar mvs-4.1.4-1.20-forge.jar NaturesCompass-1.20.1-1.11.2-forge.jar Neat-1.20.1-41-FORGE.jar netherportalfix-forge-1.20-13.0.1.jar notenoughanimations-forge-1.9.2-mc1.20.1.jar Obscure-Tooltips-2.2.jar obscure_api-15.jar OctoLib-FORGE-0.4.2+1.20.1.jar oculus-mc1.20.1-1.8.0.jar packetfixer-forge-2.0.0-1.19-to-1.20.1.jar PackingTape-1.20.1-0.14.3.jar PassiveSkillTree-1.20.1-BETA-0.6.14a-all.jar Patchouli-1.20.1-84.1-FORGE.jar phantasm-1.0.1.jar Placebo-1.20.1-8.6.2.jar player-animation-lib-forge-1.0.2-rc1+1.20.jar polymorph-forge-0.49.8+1.20.1.jar Prism-1.20.1-forge-1.0.5.jar projectvibrantjourneys-1.20.1-6.0.5.jar puffish_attributes-0.7.2-1.20-forge.jar puffish_skills-0.14.7-1.20-forge.jar PuzzlesLib-v8.1.25-1.20.1-Forge.jar QualityCrops-1.20.1-1.3.3.jar QualitysDelight-1.20.1-1.5.3.jar Quark-4.0-460.jar QUILT-2.0.0.jar repair_amulet-2.0-forge-1.20.1.jar repurposed_structures-7.1.15+1.20.1-forge.jar resourcefulconfig-forge-1.20.1-2.1.2.jar resourcefullib-forge-1.20.1-2.1.29.jar RPG-HUD-3.10.jar rpg_companions_tiny_dragons-0.0.4-forge-1.20.1.jar run.bat samurai_dynasty-0.0.48-1.20.1-neo.jar simplyswords-forge-1.56.0-1.20.1.jar SkyVillages-1.0.4-1.19.2-1.20.1-forge-release.jar smoothboot(reloaded)-mc1.20.1-0.0.4.jar sophisticatedbackpacks-1.20.1-3.23.5.1200.jar sophisticatedcore-1.20.1-1.2.12.872.jar sound-physics-remastered-forge-1.20.1-1.4.8.jar Stackable Potions-forge-1.20.1-1.0.0.jar StorageBox_v3.2.5.jar StorageDrawers-1.20.1-12.9.13.jar Structory_1.20.x_v1.3.5.jar Structory_Towers_1.20.x_v1.0.7.jar structure_gel-1.20.1-2.16.2.jar structurize-1.20.1-1.0.764-snapshot.jar SubtleEffects-forge-1.20.1-1.8.0.jar supermartijn642configlib-1.1.8-forge-mc1.20.jar supermartijn642corelib-1.1.18-forge-mc1.20.1.jar supplementaries-1.20-3.1.13.jar TaxCastlePillager+M.1.20.1+ForM.1.0.1.jar TaxTreeGiant+M.1.20.1+ForM.1.1.0.jar TerraBlender-forge-1.20.1-3.0.1.7.jar Terralith_1.20.x_v2.5.4.jar tetra-1.20.1-6.8.0.jar TheOuterEnd-1.0.10.jar tidal-towns-1.3.4.jar tlc_forge-1.0.3-R-1.20.X.jar toms_storage-1.20-1.7.0.jar toomanyglyphs-1.20.1-2.3.2.12345.jar totw_additions-1.3.1-1.20.x-forge.jar totw_modded-forge-1.20.1-1.0.5.jar Towns-and-Towers-1.12-Fabric+Forge.jar towntalk-1.20.1-1.1.0.jar trashcans-1.0.18b-forge-mc1.20.jar trashslot-forge-1.20-15.1.1.jar travelersbackpack-forge-1.20.1-9.1.16.jar TravelersTitles-1.20-Forge-4.0.2.jar tru.e-ending-v1.1.0c.jar uncrafter-forge-1.20.1-1.2.0.jar valarian_conquest-3.0-forge-1.20.1.jar valhelsia_core-forge-1.20.1-1.1.2.jar valhelsia_structures-forge-1.20.1-1.1.2.jar villagernames-1.20.1-8.2.jar visuality-forge-2.0.2.jar waystones-forge-1.20.1-14.1.9.jar WeaponsOfMiracles-20.1.8.5.6.jar XP From Harvest Reworked-1.20.x-1.2.4.jar YetAnotherConfigLib-3.6.2+1.20.1-forge.jar YungsApi-1.20-Forge-4.0.6.jar YungsBetterDesertTemples-1.20-Forge-3.0.3.jar YungsBetterDungeons-1.20-Forge-4.0.4.jar YungsBetterEndIsland-1.20-Forge-2.0.6.jar YungsBetterJungleTemples-1.20-Forge-2.0.5.jar YungsBetterMineshafts-1.20-Forge-4.0.4.jar YungsBetterNetherFortresses-1.20-Forge-2.0.6.jar YungsBetterOceanMonuments-1.20-Forge-3.0.4.jar YungsBetterWitchHuts-1.20-Forge-3.0.3.jar YungsBridges-1.20-Forge-4.0.3.jar YungsCaveBiomes-1.20.1-Forge-2.0.1.jar YungsExtras-1.20-Forge-4.0.3.jar Zeta-1.0-24.jar  
    • I did exactly like in the instruction , i even copied the build.gradle from alex mobs like he told in the instruction for citadel 1.7.0 and above, and i got 100 different error no matter what i changed in the build.gradle, i once managed to make a build succesfull but then the run client wasnt working I did exactly like in the instruction , i even copied the build.gradle from alex mobs like he told in the instruction for citadel 1.7.0 and above, and i got 100 different error no matter what i changed in the build.gradle, i once managed to make a build succesfull but then the run client wasnt working
    • Please share a link to your crash report on https://paste.ee, as explained in the FAQ
  • Topics

×
×
  • Create New...

Important Information

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