Fluid reader writer handlers

This commit is contained in:
Raoul Van den Berge
2016-11-12 02:06:40 +01:00
parent 2a49e3faf0
commit 38d078cbcc
3 changed files with 169 additions and 9 deletions

View File

@@ -0,0 +1,163 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReader;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandler;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IWriter;
import com.raoulvdberge.refinedstorage.tile.IReaderWriter;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fluids.*;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import javax.annotation.Nullable;
public class ReaderWriterHandlerFluids implements IReaderWriterHandler {
public static final String ID = "fluids";
private FluidTank tank;
private FluidTankReaderWriter tankReader, tankWriter;
public ReaderWriterHandlerFluids(@Nullable NBTTagCompound tag) {
this.tank = new FluidTank(4 * Fluid.BUCKET_VOLUME);
this.tankReader = new FluidTankReaderWriter(tank, true, false);
this.tankWriter = new FluidTankReaderWriter(tank, false, true);
if (tag != null) {
this.tank.readFromNBT(tag);
}
}
@Override
public void update(IReaderWriterChannel channel) {
// NO OP
}
@Override
public void onWriterDisabled(IWriter writer) {
// NO OP
}
@Override
public boolean hasCapability(IReaderWriter readerWriter, Capability<?> capability) {
return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY && (readerWriter instanceof IReader || readerWriter instanceof IWriter);
}
@Override
public <T> T getCapability(IReaderWriter readerWriter, Capability<T> capability) {
if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
if (readerWriter instanceof IReader) {
return (T) tankReader;
} else if (readerWriter instanceof IWriter) {
return (T) tankWriter;
}
}
return null;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
tank.writeToNBT(tag);
return tag;
}
@Override
public String getId() {
return ID;
}
private class FluidTankReaderWriter implements IFluidTank, IFluidHandler {
private FluidTank parent;
private boolean canFill, canDrain;
private IFluidTankProperties[] properties;
public FluidTankReaderWriter(FluidTank parent, boolean canFill, boolean canDrain) {
this.parent = parent;
this.canFill = canFill;
this.canDrain = canDrain;
this.properties = new IFluidTankProperties[]{
new IFluidTankProperties() {
@Nullable
@Override
public FluidStack getContents() {
return parent.getFluid();
}
@Override
public int getCapacity() {
return parent.getCapacity();
}
@Override
public boolean canFill() {
return canFill;
}
@Override
public boolean canDrain() {
return canDrain;
}
@Override
public boolean canFillFluidType(FluidStack fluidStack) {
return canFill;
}
@Override
public boolean canDrainFluidType(FluidStack fluidStack) {
return canDrain;
}
}
};
}
@Nullable
@Override
public FluidStack getFluid() {
return parent.getFluid();
}
@Override
public int getFluidAmount() {
return parent.getFluidAmount();
}
@Override
public int getCapacity() {
return parent.getCapacity();
}
@Override
public FluidTankInfo getInfo() {
return parent.getInfo();
}
@Override
public IFluidTankProperties[] getTankProperties() {
return properties;
}
@Override
public int fill(FluidStack resource, boolean doFill) {
return canFill ? parent.fill(resource, doFill) : 0;
}
@Nullable
@Override
public FluidStack drain(FluidStack resource, boolean doDrain) {
return canDrain ? parent.drain(resource, doDrain) : null;
}
@Nullable
@Override
public FluidStack drain(int maxDrain, boolean doDrain) {
return canDrain ? parent.drain(maxDrain, doDrain) : null;
}
}
}

View File

@@ -19,7 +19,6 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
import net.minecraft.client.renderer.block.model.ModelBakery;
@@ -29,7 +28,6 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
@@ -238,13 +236,10 @@ public class ProxyClient extends ProxyCommon {
ModelLoader.setCustomStateMapper(RSBlocks.CONTROLLER, new StateMap.Builder().ignore(BlockController.TYPE).build());
ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(RSBlocks.CONTROLLER), new ItemMeshDefinition() {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
int energy = stack.getItemDamage() == EnumControllerType.CREATIVE.getId() ? 7 : TileController.getEnergyScaled(ItemBlockController.getEnergyStored(stack), ItemBlockController.getEnergyCapacity(stack), 7);
ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(RSBlocks.CONTROLLER), stack -> {
int energy = stack.getItemDamage() == EnumControllerType.CREATIVE.getId() ? 7 : TileController.getEnergyScaled(ItemBlockController.getEnergyStored(stack), ItemBlockController.getEnergyCapacity(stack), 7);
return new ModelResourceLocation("refinedstorage:controller", "direction=north,energy=" + energy);
}
return new ModelResourceLocation("refinedstorage:controller", "direction=north,energy=" + energy);
});
}

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.*;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerFluids;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerItems;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRedstone;
import com.raoulvdberge.refinedstorage.apiimpl.solderer.*;
@@ -75,7 +76,8 @@ public class ProxyCommon {
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementItemStack.ID, CraftingPreviewElementItemStack::fromByteBuf);
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf);
API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerItems.ID, tag -> new ReaderWriterHandlerItems(tag));
API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerItems.ID, ReaderWriterHandlerItems::new);
API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerFluids.ID, ReaderWriterHandlerFluids::new);
API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerRedstone.ID, tag -> new ReaderWriterHandlerRedstone());
int id = 0;