/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.tile;
import cpw.mods.fml.common.Optional;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.matter.IMatterHandler;
import matteroverdrive.compat.modules.waila.IWailaBodyProvider;
import matteroverdrive.data.MachineMatterStorage;
import matteroverdrive.fluids.FluidMatterPlasma;
import matteroverdrive.machines.MachineNBTCategory;
import matteroverdrive.network.packet.client.PacketMatterUpdate;
import matteroverdrive.util.MatterHelper;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import java.util.EnumSet;
import java.util.List;
public abstract class MOTileEntityMachineMatter extends MOTileEntityMachineEnergy implements IMatterHandler, IWailaBodyProvider, IFluidHandler
{
protected MachineMatterStorage matterStorage;
public MOTileEntityMachineMatter(int upgradesCount)
{
super(upgradesCount);
matterStorage = new MachineMatterStorage(this,32768);
}
@Override
public void writeCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories, boolean toDisk)
{
super.writeCustomNBT(nbt, categories, toDisk);
if (categories.contains(MachineNBTCategory.DATA) && getMatterStorage() != null) {
getMatterStorage().writeToNBT(nbt);
}
}
@Override
public void readCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories)
{
super.readCustomNBT(nbt, categories);
if (categories.contains(MachineNBTCategory.DATA) && getMatterStorage() != null) {
getMatterStorage().readFromNBT(nbt);
}
}
@Override
public int getMatterStored()
{
if (getMatterStorage() != null)
return this.getMatterStorage().getMatterStored();
return 0;
}
@Override
public int getMatterCapacity()
{
if (getMatterStorage() != null)
return getMatterStorage().getCapacity();
return 0;
}
@Override
public int receiveMatter(ForgeDirection side, int amount, boolean simulate)
{
if (getMatterStorage() != null)
return getMatterStorage().receiveMatter(side,amount,simulate);
return 0;
}
@Override
public int extractMatter(ForgeDirection direction, int amount, boolean simulate)
{
if (getMatterStorage() != null)
return getMatterStorage().extractMatter(direction,amount,simulate);
return 0;
}
protected int modifyEnergyStored(int amount)
{
int energyModified = energyStorage.modifyEnergyStored(amount);
if (energyModified != 0)
{
UpdateClientPower();
}
return energyModified;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
if (getMatterStorage() != null)
return getMatterStorage().fill(resource,doFill);
return 0;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
if (getMatterStorage() != null)
return getMatterStorage().drain(resource.amount,doDrain);
else return null;
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
if (getMatterStorage() != null)
return getMatterStorage().drain(maxDrain,doDrain);
return null;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid)
{
return fluid instanceof FluidMatterPlasma;
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return fluid instanceof FluidMatterPlasma;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
if (getMatterStorage() != null)
return new FluidTankInfo[]{getMatterStorage().getInfo()};
return new FluidTankInfo[0];
}
public MachineMatterStorage getMatterStorage()
{
return this.matterStorage;
}
public void setMatterStored(int matter)
{
if (getMatterStorage() != null)
getMatterStorage().setMatterStored(matter);
}
public void updateClientMatter()
{
MatterOverdrive.packetPipeline.sendToAllAround(new PacketMatterUpdate(this), this, 64);
}
@Override
public void readFromPlaceItem(ItemStack itemStack)
{
super.readFromPlaceItem(itemStack);
if(itemStack != null && getMatterStorage() != null)
{
if(itemStack.hasTagCompound())
{
getMatterStorage().readFromNBT(itemStack.getTagCompound());
}
}
}
@Override
public void writeToDropItem(ItemStack itemStack)
{
super.writeToDropItem(itemStack);
if(itemStack != null && getMatterStorage() != null)
{
if(getMatterStorage().getMatterStored() > 0) {
if (!itemStack.hasTagCompound())
itemStack.setTagCompound(new NBTTagCompound());
getMatterStorage().writeToNBT(itemStack.getTagCompound());
itemStack.getTagCompound().setInteger("MaxMatter", matterStorage.getCapacity());
itemStack.getTagCompound().setInteger("MatterSend", matterStorage.getMaxExtract());
itemStack.getTagCompound().setInteger("MatterReceive", matterStorage.getMaxReceive());
}
}
}
// WAILA
@Optional.Method(modid = "Waila")
public List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
TileEntity te = accessor.getTileEntity();
if (te instanceof MOTileEntityMachineMatter) {
MOTileEntityMachineMatter machine = (MOTileEntityMachineMatter)te;
currenttip.add(EnumChatFormatting.AQUA + String.format("%s / %s %s",machine.getMatterStored(),machine.getMatterCapacity(), MatterHelper.MATTER_UNIT));
} else {
throw new RuntimeException("MOTileEntityMachineMatter WAILA provider is being used for something that is not a MOTileEntityMachineMatter: " + te.getClass());
}
return currenttip;
}
}