package imdutch21.oilcraft.tileentity; import imdutch21.oilcraft.fluids.OCFluidRegistry; import imdutch21.oilcraft.potion.OCPotionRegistry; import imdutch21.oilcraft.recipe.OilCompressorRecipe; import imdutch21.oilcraft.util.InventoryUtils; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyReceiver; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.potion.PotionEffect; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.fluids.*; import java.util.List; import java.util.Random; public class TileEntityOilCompressor extends OCTickingTileEntity implements ISidedInventory, IFluidHandler, IEnergyReceiver, IEnergyHandler { public FluidTank tank = new FluidTank(10000); public EnergyStorage energyStorage = new EnergyStorage(8000, 1000); public ItemStack[] items = new ItemStack[3]; public static final int[] slotsInsert = new int[]{0, 1}; public static final int[] slotsExtract = new int[]{2}; public int progress = 0; @Override public void update() { super.update(); if (worldObj.isRemote) return; if (items[0] != null) { OilCompressorRecipe recipe = OilCompressorRecipe.getRecipeFromItem(items[0]); if (recipe != null && tank.getFluidAmount() + recipe.oilAmount <= tank.getCapacity() && energyStorage.getEnergyStored() - recipe.energyAmount >= 0) { if (progress >= recipe.time) { progress = 0; tank.fill(new FluidStack(OCFluidRegistry.OIL, recipe.oilAmount), true); energyStorage.extractEnergy(recipe.energyAmount, false); setInventorySlotContents(0, items[0].stackSize > 1 ? new ItemStack(items[0].getItem(), items[0].stackSize - 1, items[0].getItemDamage()) : null); Random random = new Random(); worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); if (random.nextInt(40) == 0){ List<EntityLivingBase> list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(getPos().getX() - 5, getPos().getY() - 5, getPos().getZ() - 5, getPos().getX() + 5, getPos().getY() + 5, getPos().getZ() + 5)); for (EntityLivingBase entity : list) entity.addPotionEffect(new PotionEffect(OCPotionRegistry.SLIPPERY, 60, 2)); } } else { progress++; worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); } } else { progress = 0; } } else { progress = 0; } if (items[1] != null){ if (items[1].getItem() == Items.BUCKET && tank.getFluidAmount() >= 1000 && items[2] == null){ tank.drain(1000, true); items[2] = UniversalBucket.getFilledBucket(ForgeModContainer.getInstance().universalBucket, OCFluidRegistry.OIL); setInventorySlotContents(1, items[1].stackSize > 1 ? new ItemStack(items[1].getItem(), items[1].stackSize - 1, items[1].getItemDamage()) : null); } } } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tank.readFromNBT(nbt); InventoryUtils.loadInventory(nbt, this); energyStorage.readFromNBT(nbt); progress = nbt.getInteger("progress"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); tank.writeToNBT(nbt); InventoryUtils.saveInventory(nbt, this); energyStorage.writeToNBT(nbt); nbt.setInteger("progress", progress); return nbt; } @Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound tag = new NBTTagCompound(); writeToNBT(tag); return new SPacketUpdateTileEntity(getPos(), 0, tag); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { NBTTagCompound nbt = packet.getNbtCompound(); readFromNBT(nbt); } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { return 0; } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return tank.drain(resource.amount, doDrain); } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return tank.drain(maxDrain, doDrain); } @Override public boolean canFill(EnumFacing from, Fluid fluid) { return false; } @Override public boolean canDrain(EnumFacing from, Fluid fluid) { return true; } @Override public FluidTankInfo[] getTankInfo(EnumFacing from) { return new FluidTankInfo[]{new FluidTankInfo(tank)}; } @Override public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return energyStorage.receiveEnergy(maxReceive, simulate); } @Override public int getEnergyStored(EnumFacing from) { return energyStorage.getEnergyStored(); } @Override public int getMaxEnergyStored(EnumFacing from) { return energyStorage.getMaxEnergyStored(); } @Override public boolean canConnectEnergy(EnumFacing from) { return true; } @Override public int[] getSlotsForFace(EnumFacing side) { if (side == EnumFacing.DOWN) return slotsExtract; else return slotsInsert; } @Override public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) { return direction != EnumFacing.DOWN && ((index == 1 && itemStackIn.getItem() == Items.BUCKET) || index == 0); } @Override public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { return index == 2; } @Override public int getSizeInventory() { return 2; } @Override public ItemStack getStackInSlot(int index) { if (index > items.length) return null; return items[index]; } @Override public ItemStack decrStackSize(int index, int count) { if (this.items[index] != null) { ItemStack itemstack; if (this.items[index].stackSize <= count) { itemstack = this.items[index]; this.items[index] = null; return itemstack; } else { itemstack = this.items[index].splitStack(count); if (this.items[index].stackSize == 0) { this.items[index] = null; } return itemstack; } } else { return null; } } @Override public ItemStack removeStackFromSlot(int index) { if (index > items.length) return null; if (this.items[index] != null) { ItemStack itemstack = this.items[index]; this.items[index] = null; return itemstack; } else { return null; } } @Override public void setInventorySlotContents(int index, ItemStack stack) { this.items[index] = stack; if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { stack.stackSize = this.getInventoryStackLimit(); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return true; } @Override public void openInventory(EntityPlayer player) { } @Override public void closeInventory(EntityPlayer player) { } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return (index == 1 && stack.getItem() == Items.BUCKET) || (index == 0 && stack != null); } @Override public int getField(int id) { return 0; } @Override public void setField(int id, int value) { } @Override public int getFieldCount() { return 0; } @Override public void clear() { for (int i = 0; i < items.length; ++i) { this.items[i] = null; } } @Override public String getName() { return "container.oilCompressor"; } @Override public boolean hasCustomName() { return false; } @Override public ITextComponent getDisplayName() { return null; } }