Files
refinedstorage/src/main/java/refinedstorage/tile/TileStorage.java
2016-06-19 01:56:03 +02:00

258 lines
6.7 KiB
Java
Executable File

package refinedstorage.tile;
import io.netty.buffer.ByteBuf;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.RefinedStorageCapabilities;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.api.storage.NBTStorage;
import refinedstorage.block.BlockStorage;
import refinedstorage.block.EnumStorageType;
import refinedstorage.container.ContainerStorage;
import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.network.MessagePriorityUpdate;
import refinedstorage.tile.config.*;
import java.util.List;
public class TileStorage extends TileMachine implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig {
class Storage extends NBTStorage {
public Storage() {
super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this);
}
@Override
public int getPriority() {
return priority;
}
@Override
public ItemStack push(ItemStack stack, int size, boolean simulate) {
if (!ModeFilter.respectsMode(filters, TileStorage.this, compare, stack)) {
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
return super.push(stack, size, simulate);
}
}
public static final String NBT_STORAGE = "Storage";
public static final String NBT_PRIORITY = "Priority";
public static final String NBT_COMPARE = "Compare";
public static final String NBT_MODE = "Mode";
private BasicItemHandler filters = new BasicItemHandler(9, this);
private NBTTagCompound storageTag = NBTStorage.createNBT();
private Storage storage;
private EnumStorageType type;
private int priority = 0;
private int compare = 0;
private int mode = ModeConstants.WHITELIST;
private int stored;
@Override
public int getEnergyUsage() {
return 1;
}
@Override
public void updateMachine() {
}
@Override
public void update() {
super.update();
if (storage == null && storageTag != null) {
storage = new Storage();
}
}
@Override
public void provide(List<IStorage> storages) {
if (storage != null) {
storages.add(storage);
}
}
@Override
public void read(NBTTagCompound nbt) {
super.read(nbt);
RefinedStorageUtils.readItems(filters, 0, nbt);
if (nbt.hasKey(NBT_PRIORITY)) {
priority = nbt.getInteger(NBT_PRIORITY);
}
if (nbt.hasKey(NBT_STORAGE)) {
storageTag = nbt.getCompoundTag(NBT_STORAGE);
}
if (nbt.hasKey(NBT_COMPARE)) {
compare = nbt.getInteger(NBT_COMPARE);
}
if (nbt.hasKey(NBT_MODE)) {
mode = nbt.getInteger(NBT_MODE);
}
}
@Override
public NBTTagCompound write(NBTTagCompound tag) {
super.write(tag);
RefinedStorageUtils.writeItems(filters, 0, tag);
tag.setInteger(NBT_PRIORITY, priority);
tag.setTag(NBT_STORAGE, storageTag);
tag.setInteger(NBT_COMPARE, compare);
tag.setInteger(NBT_MODE, mode);
return tag;
}
public EnumStorageType getType() {
if (type == null && worldObj.getBlockState(pos).getBlock() == RefinedStorageBlocks.STORAGE) {
this.type = ((EnumStorageType) worldObj.getBlockState(pos).getValue(BlockStorage.TYPE));
}
return type == null ? EnumStorageType.TYPE_1K : type;
}
@Override
public void writeContainerData(ByteBuf buf) {
super.writeContainerData(buf);
buf.writeInt(NBTStorage.getStoredFromNBT(storageTag));
buf.writeInt(priority);
buf.writeInt(compare);
buf.writeInt(mode);
}
@Override
public void readContainerData(ByteBuf buf) {
super.readContainerData(buf);
stored = buf.readInt();
priority = buf.readInt();
compare = buf.readInt();
mode = buf.readInt();
}
@Override
public Class<? extends Container> getContainer() {
return ContainerStorage.class;
}
@Override
public int getCompare() {
return compare;
}
@Override
public void setCompare(int compare) {
this.compare = compare;
markDirty();
}
@Override
public int getMode() {
return mode;
}
@Override
public void setMode(int mode) {
this.mode = mode;
markDirty();
}
@Override
public String getGuiTitle() {
return "block.refinedstorage:storage." + getType().getId() + ".name";
}
@Override
public IItemHandler getFilters() {
return filters;
}
@Override
public IRedstoneModeConfig getRedstoneModeConfig() {
return this;
}
@Override
public ICompareConfig getCompareConfig() {
return this;
}
@Override
public IModeConfig getModeConfig() {
return this;
}
@Override
public void onPriorityChanged(int priority) {
RefinedStorage.NETWORK.sendToServer(new MessagePriorityUpdate(pos, priority));
}
public NBTTagCompound getStorageTag() {
return storageTag;
}
public void setStorageTag(NBTTagCompound storageTag) {
this.storageTag = storageTag;
}
@Override
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
markDirty();
}
@Override
public int getStored() {
return stored;
}
@Override
public int getCapacity() {
return getType().getCapacity();
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if (capability == RefinedStorageCapabilities.STORAGE_PROVIDER_CAPABILITY) {
return (T) this;
}
return super.getCapability(capability, facing);
}
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return capability == RefinedStorageCapabilities.STORAGE_PROVIDER_CAPABILITY || super.hasCapability(capability, facing);
}
}