package choonster.testmod3.tileentity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.EnumSet; import java.util.Set; /** * A tank that holds 10 buckets of fluid and can have access enabled and disabled for each facing. * * @author Choonster */ public class TileEntityFluidTankRestricted extends TileEntityFluidTank { /** * The facings that the {@link IFluidHandler} can be accessed from. */ private final Set<EnumFacing> enabledFacings = EnumSet.allOf(EnumFacing.class); /** * Toggle the enabled state for the specified facing. * * @param facing The facing * @return Is the facing now enabled? */ public boolean toggleFacing(EnumFacing facing) { if (enabledFacings.contains(facing)) { enabledFacings.remove(facing); return false; } else { enabledFacings.add(facing); return true; } } /** * Is the specified facing enabled? * * @param facing The facing * @return Is the facing enabled? */ public boolean isFacingEnabled(final @Nullable EnumFacing facing) { return enabledFacings.contains(facing) || facing == null; } /** * Get the enabled facings. * * @return The enabled facings. */ public Set<EnumFacing> getEnabledFacings() { return enabledFacings; } @Override public void readFromNBT(final NBTTagCompound tag) { super.readFromNBT(tag); enabledFacings.clear(); final int[] enabledFacingIndices = tag.getIntArray("EnabledFacings"); for (final int index : enabledFacingIndices) { enabledFacings.add(EnumFacing.getFront(index)); } } @Override public NBTTagCompound writeToNBT(final NBTTagCompound tag) { final int[] enabledFacingIndices = enabledFacings.stream() .mapToInt(EnumFacing::getIndex) .toArray(); tag.setIntArray("EnabledFacings", enabledFacingIndices); return super.writeToNBT(tag); } @Override public boolean hasCapability(@Nonnull final Capability<?> capability, @Nullable final EnumFacing facing) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return isFacingEnabled(facing); } return super.hasCapability(capability, facing); } @Nullable @Override public <T> T getCapability(@Nonnull final Capability<T> capability, @Nullable final EnumFacing facing) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { if (isFacingEnabled(facing)) { return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tank); } return null; } return super.getCapability(capability, facing); } }