I've tried to make a portable generator, that turns on when you press the button.
But when I add to update() function
if(isTurned)
then the tile seems to update fuel and energy only in gui, everthing else sees tile's energy and fuel as 0.
TileEntity
package com.xxTFxx.siberianadv.tileentity;
import javax.annotation.Nullable;
import com.xxTFxx.siberianadv.energy.CustomEnergyStorage;
import com.xxTFxx.siberianadv.gui.GUIPortableGenerator;
import com.xxTFxx.siberianadv.init.FluidInit;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class TileEntityPortableGenerator extends TileEntity implements ITickable
{
public ItemStackHandler handler = new ItemStackHandler(2)
{
protected void onContentsChanged(int slot) {
TileEntityPortableGenerator.this.markDirty();
};
};
private CustomEnergyStorage storage = new CustomEnergyStorage(40000);
private FluidTank tank = new FluidTank(FluidInit.PETROLEUM_FLUID, 0, 5000);
private int FLUID_DRAIN = 5;
private int ENERGY_GAIN = 100;
private boolean isTurned = false;
@Override
public void update() {
if(isTurned)
{
if(tank.getFluidAmount() >= FLUID_DRAIN && storage.getEnergyStored() + ENERGY_GAIN <= storage.getMaxEnergyStored())
{
markDirty();
tank.drain(FLUID_DRAIN, true);
storage.addEnergy(ENERGY_GAIN);
}
}
}
public void turnOffOn()
{
this.isTurned = !this.isTurned;
}
public boolean isWorking()
{
return this.isTurned;
}
public int getMaxEnergyStored()
{
return this.storage.getMaxEnergyStored();
}
public int getEnergyStored()
{
return this.storage.getEnergyStored();
}
public int getFluidAmount()
{
return this.tank.getFluidAmount();
}
public int getMaxFluidAmount()
{
return this.tank.getCapacity();
}
public void setEnergy(int energy)
{
this.storage.setEnergy(energy);
}
public boolean canFillTank(int fluid) {
if(this.tank.getFluidAmount() + fluid <= this.tank.getCapacity())
{
return true;
}
return false;
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if(capability == CapabilityEnergy.ENERGY)
{
return (T)this.storage;
}
if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
{
return (T)this.tank;
}
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
{
return (T)this.handler;
}
return super.getCapability(capability, facing);
}
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
if(capability == CapabilityEnergy.ENERGY)
{
return true;
}
if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
{
return true;
}
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
{
return true;
}
return super.hasCapability(capability, facing);
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
compound.setTag("Inventory", this.handler.serializeNBT());
compound.setBoolean("Working", this.isTurned);
this.storage.writeToNBT(compound);
this.tank.writeToNBT(compound);
super.writeToNBT(compound);
return compound;
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
this.handler.deserializeNBT(compound.getCompoundTag("Inventory"));
this.isTurned = compound.getBoolean("Working");
this.storage.readFromNBT(compound);
this.tank.readFromNBT(compound);
}
public boolean isUsableByPlayer(EntityPlayer player)
{
return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
}
@Override
@Nullable
public SPacketUpdateTileEntity getUpdatePacket() {
return new SPacketUpdateTileEntity(this.pos, 3, this.getUpdateTag());
}
@Override
public NBTTagCompound getUpdateTag() {
return this.writeToNBT(new NBTTagCompound());
}
@Override
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
super.onDataPacket(net, pkt);
handleUpdateTag(pkt.getNbtCompound());
}
}
GUI
package com.xxTFxx.siberianadv.gui;
import com.xxTFxx.siberianadv.Main;
import com.xxTFxx.siberianadv.container.ContainerPortableGenerator;
import com.xxTFxx.siberianadv.tileentity.TileEntityPortableGenerator;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
public class GUIPortableGenerator extends GuiContainer
{
private static final ResourceLocation TEXTURES = new ResourceLocation(Main.MOD_ID + ":textures/gui/portable_generator.png");
private final TileEntityPortableGenerator tileentity;
private final InventoryPlayer player;
public GUIPortableGenerator(InventoryPlayer player , TileEntityPortableGenerator tileentity) {
super(new ContainerPortableGenerator(player, tileentity));
this.tileentity = tileentity;
this.player = player;
}
public void drawScreen(int mouseX, int mouseY, float partialTicks)
{
this.drawDefaultBackground();
super.drawScreen(mouseX, mouseY, partialTicks);
this.renderHoveredToolTip(mouseX, mouseY);
}
@Override
public void initGui() {
super.initGui();
this.buttonList.add(new GuiButton(0, this.guiLeft + 20, this.guiTop + 20 , 30 , 20 , this.setButtonText()));
}
private String setButtonText()
{
if(this.tileentity.isWorking())
{
return "OFF";
}
else return "ON";
}
@Override
protected void actionPerformed(GuiButton button) {
if(this.tileentity.isWorking())
{
this.tileentity.turnOffOn();
this.selectedButton.displayString = "ON";
}
else
{
this.tileentity.turnOffOn();
this.selectedButton.displayString = "OFF";
}
}
@Override
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY)
{
if(mouseX > this.guiLeft + 150 && mouseY > this.guiTop + 5 && mouseX < this.guiLeft + 169 && mouseY < this.guiTop + 80)
{
this.drawHoveringText(Integer.toString(this.tileentity.getEnergyStored()), mouseX - this.guiLeft, mouseY - this.guiTop);
}
if(mouseX > this.guiLeft + 128 && mouseY > this.guiTop + 5 && mouseX < this.guiLeft + 147 && mouseY < this.guiTop + 80)
{
this.drawHoveringText(Integer.toString(this.tileentity.getFluidAmount()), mouseX - this.guiLeft, mouseY - this.guiTop);
}
}
@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY)
{
GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
this.mc.getTextureManager().bindTexture(TEXTURES);
this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
int k = this.getEnergyStoredScaled(75);
this.drawTexturedModalRect(this.guiLeft + 152, this.guiTop + 7, 176, 32, 16, 75 - k);
int l = this.getFluidStored(75);
this.drawTexturedModalRect(this.guiLeft + 130, this.guiTop + 7, 176, 32, 16, 75 - l);
}
private int getEnergyStoredScaled(int pixels)
{
int i = this.tileentity.getEnergyStored();
int j = this.tileentity.getMaxEnergyStored();
return i != 0 && j != 0 ? i * pixels / j : 0;
}
private int getFluidStored(int pixels)
{
int i = this.tileentity.getFluidAmount();
int j = this.tileentity.getMaxFluidAmount();
return i != 0 && j != 0 ? i * pixels / j : 0;
}
}
Container
package com.xxTFxx.siberianadv.container;
import com.xxTFxx.siberianadv.tileentity.TileEntityPortableGenerator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.SlotItemHandler;
public class ContainerPortableGenerator extends Container
{
private final TileEntityPortableGenerator tile;
public ContainerPortableGenerator(InventoryPlayer player , TileEntityPortableGenerator tile) {
this.tile = tile;
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
this.addSlotToContainer(new SlotItemHandler(handler, 0, 105, 13));
this.addSlotToContainer(new SlotItemHandler(handler, 1, 105, 56));
for(int y = 0; y < 3; y++)
{
for(int x = 0; x < 9; x++)
{
this.addSlotToContainer(new Slot(player, x + y*9 + 9, 8 + x*18, 84 + y*18));
}
}
for(int x = 0; x < 9; x++)
{
this.addSlotToContainer(new Slot(player, x, 8 + x * 18, 142));
}
}
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
return this.tile.isUsableByPlayer(playerIn);
}
}
Block
package com.xxTFxx.siberianadv.block.machines;
import com.xxTFxx.siberianadv.Main;
import com.xxTFxx.siberianadv.block.RotBlock;
import com.xxTFxx.siberianadv.init.FluidInit;
import com.xxTFxx.siberianadv.init.ModBlocks;
import com.xxTFxx.siberianadv.tabs.ModTab;
import com.xxTFxx.siberianadv.tileentity.TileEntityPortableGenerator;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
public class PortableGenerator extends Block{
//public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
public PortableGenerator(String name) {
super(Material.IRON);
setUnlocalizedName(Main.MOD_ID + "." + name);
setRegistryName(name);
setCreativeTab(ModTab.Mod_Tab);
setHardness(0.5F);
ModBlocks.blocks.add(this);
}
@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn,
EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
IFluidHandler handler = worldIn.getTileEntity(pos).getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null);
TileEntityPortableGenerator tile = (TileEntityPortableGenerator)worldIn.getTileEntity(pos);
if(playerIn.getHeldItemMainhand().getItem() == FluidUtil.getFilledBucket(new FluidStack(FluidInit.PETROLEUM_FLUID, Fluid.BUCKET_VOLUME)).getItem() && tile.canFillTank(1000))
if(playerIn.isCreative())
{
handler.fill(new FluidStack(FluidInit.PETROLEUM_FLUID, 1000), true);
}
else
{
handler.fill(new FluidStack(FluidInit.PETROLEUM_FLUID, 1000), true);
playerIn.getHeldItemMainhand().shrink(1);
playerIn.addItemStackToInventory(new ItemStack(Items.BUCKET));
}
else if(!worldIn.isRemote) {
playerIn.openGui(Main.MOD_ID, Main.GUI_PORTABLE_GENERATOR, worldIn, pos.getX(), pos.getY(), pos.getZ());
System.out.println(tile.getEnergyStored());
System.out.println(tile.getFluidAmount());
}
return true;
}
@Override
public boolean hasTileEntity(IBlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state) {
return new TileEntityPortableGenerator();
}
public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, IBlockState state, float chance, int fortune)
{
}
@Override
public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
TileEntity tileentity = worldIn.getTileEntity(pos);
if(tileentity instanceof TileEntityPortableGenerator)
{
TileEntityPortableGenerator tileEntityPortableGenerator = (TileEntityPortableGenerator)tileentity;
ItemStack itemstack = new ItemStack(Item.getItemFromBlock(this));
NBTTagCompound nbttagcompound = new NBTTagCompound();
nbttagcompound.setInteger("Energy", tileEntityPortableGenerator.getEnergyStored());
nbttagcompound.setInteger("Fuel", tileEntityPortableGenerator.getFluidAmount());
itemstack.setTagCompound(nbttagcompound);
spawnAsEntity(worldIn, pos, itemstack);
}
super.breakBlock(worldIn, pos, state);
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer,
ItemStack stack) {
NBTTagCompound nbt = stack.getTagCompound();
if(nbt != null)
{
TileEntityPortableGenerator tileGenerator = (TileEntityPortableGenerator)worldIn.getTileEntity(pos);
tileGenerator.setEnergy(nbt.getInteger("Energy"));
tileGenerator.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).fill(new FluidStack(FluidInit.PETROLEUM_FLUID, nbt.getInteger("Fuel")), true);
}
super.onBlockPlacedBy(worldIn, pos, state, placer, stack);
}
}