diff --git a/src/main/java/storagecraft/block/BlockStorage.java b/src/main/java/storagecraft/block/BlockStorage.java index 74e0b90eb..88e2586a8 100644 --- a/src/main/java/storagecraft/block/BlockStorage.java +++ b/src/main/java/storagecraft/block/BlockStorage.java @@ -8,9 +8,11 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import static storagecraft.block.BlockBase.DIRECTION; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import storagecraft.tile.TileStorage; -public class BlockStorage extends BlockBase +public class BlockStorage extends BlockMachine { public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumStorageType.class); @@ -34,6 +36,7 @@ public class BlockStorage extends BlockBase return new BlockState(this, new IProperty[] { DIRECTION, + CONNECTED, TYPE }); } @@ -49,4 +52,10 @@ public class BlockStorage extends BlockBase { return ((EnumStorageType) state.getValue(TYPE)).getId(); } + + @Override + public TileEntity createTileEntity(World world, IBlockState state) + { + return new TileStorage(); + } } diff --git a/src/main/java/storagecraft/item/ItemStorageCell.java b/src/main/java/storagecraft/item/ItemStorageCell.java index 583a0c7e6..8405f097f 100644 --- a/src/main/java/storagecraft/item/ItemStorageCell.java +++ b/src/main/java/storagecraft/item/ItemStorageCell.java @@ -1,16 +1,14 @@ package storagecraft.item; +import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import storagecraft.storage.CellStorage; - -import java.util.List; +import storagecraft.storage.NBTStorage; public class ItemStorageCell extends ItemBase { @@ -41,13 +39,13 @@ public class ItemStorageCell extends ItemBase @Override public void addInformation(ItemStack cell, EntityPlayer player, List list, boolean b) { - if (getCapacity(cell) == -1) + if (CellStorage.getCapacity(cell) == -1) { - list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storage_cell_stored"), getStored(cell))); + list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storage_cell_stored"), NBTStorage.getStored(cell.getTagCompound()))); } else { - list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storage_cell_stored_capacity"), getStored(cell), getCapacity(cell))); + list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storage_cell_stored_capacity"), NBTStorage.getStored(cell.getTagCompound()), CellStorage.getCapacity(cell))); } } @@ -59,37 +57,10 @@ public class ItemStorageCell extends ItemBase initNBT(stack); } - private ItemStack initNBT(ItemStack cell) + private ItemStack initNBT(ItemStack stack) { - cell.setTagCompound(new NBTTagCompound()); + stack.setTagCompound(NBTStorage.getBaseNBT()); - cell.getTagCompound().setTag(CellStorage.NBT_ITEMS, new NBTTagList()); - cell.getTagCompound().setInteger(CellStorage.NBT_STORED, 0); - - return cell; - } - - public static int getStored(ItemStack cell) - { - return cell.getTagCompound().getInteger(CellStorage.NBT_STORED); - } - - public static int getCapacity(ItemStack cell) - { - switch (cell.getItemDamage()) - { - case TYPE_1K: - return 1000; - case TYPE_4K: - return 4000; - case TYPE_16K: - return 16000; - case TYPE_64K: - return 64000; - case TYPE_CREATIVE: - return -1; - } - - return 0; + return stack; } } diff --git a/src/main/java/storagecraft/proxy/ClientProxy.java b/src/main/java/storagecraft/proxy/ClientProxy.java index 86d8c46de..7cd0735da 100644 --- a/src/main/java/storagecraft/proxy/ClientProxy.java +++ b/src/main/java/storagecraft/proxy/ClientProxy.java @@ -3,6 +3,7 @@ package storagecraft.proxy; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.ItemModelMesher; +import net.minecraft.client.renderer.block.statemap.StateMap; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.item.Item; @@ -15,6 +16,8 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import storagecraft.StorageCraftBlocks; import storagecraft.StorageCraftItems; +import storagecraft.block.BlockBase; +import storagecraft.block.BlockMachine; import storagecraft.block.EnumControllerType; import storagecraft.block.EnumGridType; import storagecraft.block.EnumStorageType; @@ -64,6 +67,13 @@ public class ClientProxy extends CommonProxy new ResourceLocation("storagecraft:wireless_grid_disconnected") ); + ModelBakery.registerItemVariants(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), + new ResourceLocation("storagecraft:storage"), + new ResourceLocation("storagecraft:storage"), + new ResourceLocation("storagecraft:storage"), + new ResourceLocation("storagecraft:storage") + ); + ForgeHooksClient.registerTESRItemStack(Item.getItemFromBlock(StorageCraftBlocks.CABLE), 0, TileCable.class); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(StorageCraftBlocks.CABLE), 0, new ModelResourceLocation("storagecraft:cable", "inventory")); @@ -130,10 +140,12 @@ public class ClientProxy extends CommonProxy mesher.register(Item.getItemFromBlock(StorageCraftBlocks.SOLDERER), 0, new ModelResourceLocation("storagecraft:solderer", "inventory")); mesher.register(Item.getItemFromBlock(StorageCraftBlocks.WIRELESS_TRANSMITTER), 0, new ModelResourceLocation("storagecraft:wireless_transmitter", "inventory")); mesher.register(Item.getItemFromBlock(StorageCraftBlocks.DETECTOR), 0, new ModelResourceLocation("storagecraft:detector", "inventory")); - mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_1K.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); - mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_4K.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); - mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_16K.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); - mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_64K.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); - mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_CREATIVE.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); + mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_1K.getId(), new ModelResourceLocation("storagecraft:storage")); + mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_4K.getId(), new ModelResourceLocation("storagecraft:storage")); + mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_16K.getId(), new ModelResourceLocation("storagecraft:storage")); + mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_64K.getId(), new ModelResourceLocation("storagecraft:storage")); + mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_CREATIVE.getId(), new ModelResourceLocation("storagecraft:storage")); + + ModelLoader.setCustomStateMapper(StorageCraftBlocks.STORAGE, new StateMap.Builder().ignore(BlockMachine.CONNECTED).ignore(BlockBase.DIRECTION).build()); } } diff --git a/src/main/java/storagecraft/proxy/CommonProxy.java b/src/main/java/storagecraft/proxy/CommonProxy.java index 03a5d8171..9d2eed195 100644 --- a/src/main/java/storagecraft/proxy/CommonProxy.java +++ b/src/main/java/storagecraft/proxy/CommonProxy.java @@ -49,6 +49,7 @@ public class CommonProxy GameRegistry.registerTileEntity(TileWirelessTransmitter.class, "wireless_transmitter"); GameRegistry.registerTileEntity(TileDestructor.class, "destructor"); GameRegistry.registerTileEntity(TileConstructor.class, "constructor"); + GameRegistry.registerTileEntity(TileStorage.class, "storage"); GameRegistry.registerBlock(StorageCraftBlocks.CONTROLLER, ItemBlockController.class, "controller"); GameRegistry.registerBlock(StorageCraftBlocks.CABLE, "cable"); diff --git a/src/main/java/storagecraft/storage/CellStorage.java b/src/main/java/storagecraft/storage/CellStorage.java index c7de52235..8341cf335 100644 --- a/src/main/java/storagecraft/storage/CellStorage.java +++ b/src/main/java/storagecraft/storage/CellStorage.java @@ -1,129 +1,31 @@ package storagecraft.storage; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import storagecraft.item.ItemStorageCell; -import java.util.List; - -public class CellStorage implements IStorage +public class CellStorage extends NBTStorage { - public static final String NBT_ITEMS = "Items"; - public static final String NBT_STORED = "Stored"; - - public static final String NBT_ITEM_TYPE = "Type"; - public static final String NBT_ITEM_QUANTITY = "Quantity"; - public static final String NBT_ITEM_DAMAGE = "Damage"; - public static final String NBT_ITEM_NBT = "NBT"; - - private ItemStack cell; - public CellStorage(ItemStack cell) { - this.cell = cell; + super(cell.getTagCompound(), getCapacity(cell)); } - @Override - public void addItems(List items) + public static int getCapacity(ItemStack cell) { - NBTTagList list = (NBTTagList) cell.getTagCompound().getTag(NBT_ITEMS); - - for (int i = 0; i < list.tagCount(); ++i) + switch (cell.getItemDamage()) { - items.add(createItemFromNBT(list.getCompoundTagAt(i))); - } - } - - @Override - public void push(ItemStack stack) - { - NBTTagList list = (NBTTagList) cell.getTagCompound().getTag(NBT_ITEMS); - - cell.getTagCompound().setInteger(NBT_STORED, ItemStorageCell.getStored(cell) + stack.stackSize); - - for (int i = 0; i < list.tagCount(); ++i) - { - NBTTagCompound tag = list.getCompoundTagAt(i); - - StorageItem item = createItemFromNBT(tag); - - if (item.compareNoQuantity(stack)) - { - tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() + stack.stackSize); - - return; - } + case ItemStorageCell.TYPE_1K: + return 1000; + case ItemStorageCell.TYPE_4K: + return 4000; + case ItemStorageCell.TYPE_16K: + return 16000; + case ItemStorageCell.TYPE_64K: + return 64000; + case ItemStorageCell.TYPE_CREATIVE: + return -1; } - NBTTagCompound tag = new NBTTagCompound(); - - tag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); - tag.setInteger(NBT_ITEM_QUANTITY, stack.stackSize); - tag.setInteger(NBT_ITEM_DAMAGE, stack.getItemDamage()); - - if (stack.hasTagCompound()) - { - tag.setTag(NBT_ITEM_NBT, stack.getTagCompound()); - } - - list.appendTag(tag); - } - - @Override - public ItemStack take(ItemStack stack, int flags) - { - int quantity = stack.stackSize; - - NBTTagList list = (NBTTagList) cell.getTagCompound().getTag(NBT_ITEMS); - - for (int i = 0; i < list.tagCount(); ++i) - { - NBTTagCompound tag = list.getCompoundTagAt(i); - - StorageItem item = createItemFromNBT(tag); - - if (item.compare(stack, flags)) - { - if (quantity > item.getQuantity()) - { - quantity = item.getQuantity(); - } - - tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() - quantity); - - if (item.getQuantity() - quantity == 0) - { - list.removeTag(i); - } - - cell.getTagCompound().setInteger(NBT_STORED, ItemStorageCell.getStored(cell) - quantity); - - ItemStack newItem = item.toItemStack(); - - newItem.stackSize = quantity; - - return newItem; - } - } - - return null; - } - - @Override - public boolean canPush(ItemStack stack) - { - if (ItemStorageCell.getCapacity(cell) == -1) - { - return true; - } - - return (ItemStorageCell.getStored(cell) + stack.stackSize) <= ItemStorageCell.getCapacity(cell); - } - - private StorageItem createItemFromNBT(NBTTagCompound tag) - { - return new StorageItem(Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), tag.getInteger(NBT_ITEM_QUANTITY), tag.getInteger(NBT_ITEM_DAMAGE), tag.hasKey(NBT_ITEM_NBT) ? ((NBTTagCompound) tag.getTag(NBT_ITEM_NBT)) : null); + return 0; } } diff --git a/src/main/java/storagecraft/storage/NBTStorage.java b/src/main/java/storagecraft/storage/NBTStorage.java new file mode 100644 index 000000000..4942a3217 --- /dev/null +++ b/src/main/java/storagecraft/storage/NBTStorage.java @@ -0,0 +1,144 @@ +package storagecraft.storage; + +import java.util.List; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class NBTStorage implements IStorage +{ + public static final String NBT_ITEMS = "Items"; + public static final String NBT_STORED = "Stored"; + + public static final String NBT_ITEM_TYPE = "Type"; + public static final String NBT_ITEM_QUANTITY = "Quantity"; + public static final String NBT_ITEM_DAMAGE = "Damage"; + public static final String NBT_ITEM_NBT = "NBT"; + + private NBTTagCompound nbtTag; + private int capacity; + + public NBTStorage(NBTTagCompound tag, int capacity) + { + this.nbtTag = tag; + this.capacity = capacity; + } + + @Override + public void addItems(List items) + { + NBTTagList list = (NBTTagList) nbtTag.getTag(NBT_ITEMS); + + for (int i = 0; i < list.tagCount(); ++i) + { + items.add(createItemFromNBT(list.getCompoundTagAt(i))); + } + } + + @Override + public void push(ItemStack stack) + { + NBTTagList list = (NBTTagList) nbtTag.getTag(NBT_ITEMS); + + nbtTag.setInteger(NBT_STORED, getStored(nbtTag) + stack.stackSize); + + for (int i = 0; i < list.tagCount(); ++i) + { + NBTTagCompound tag = list.getCompoundTagAt(i); + + StorageItem item = createItemFromNBT(tag); + + if (item.compareNoQuantity(stack)) + { + tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() + stack.stackSize); + + return; + } + } + + NBTTagCompound tag = new NBTTagCompound(); + + tag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); + tag.setInteger(NBT_ITEM_QUANTITY, stack.stackSize); + tag.setInteger(NBT_ITEM_DAMAGE, stack.getItemDamage()); + + if (stack.hasTagCompound()) + { + tag.setTag(NBT_ITEM_NBT, stack.getTagCompound()); + } + + list.appendTag(tag); + } + + @Override + public ItemStack take(ItemStack stack, int flags) + { + int quantity = stack.stackSize; + + NBTTagList list = (NBTTagList) nbtTag.getTag(NBT_ITEMS); + + for (int i = 0; i < list.tagCount(); ++i) + { + NBTTagCompound tag = list.getCompoundTagAt(i); + + StorageItem item = createItemFromNBT(tag); + + if (item.compare(stack, flags)) + { + if (quantity > item.getQuantity()) + { + quantity = item.getQuantity(); + } + + tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() - quantity); + + if (item.getQuantity() - quantity == 0) + { + list.removeTag(i); + } + + nbtTag.setInteger(NBT_STORED, getStored(nbtTag) - quantity); + + ItemStack newItem = item.toItemStack(); + + newItem.stackSize = quantity; + + return newItem; + } + } + + return null; + } + + @Override + public boolean canPush(ItemStack stack) + { + if (capacity == -1) + { + return true; + } + + return (getStored(nbtTag) + stack.stackSize) <= capacity; + } + + private StorageItem createItemFromNBT(NBTTagCompound tag) + { + return new StorageItem(Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), tag.getInteger(NBT_ITEM_QUANTITY), tag.getInteger(NBT_ITEM_DAMAGE), tag.hasKey(NBT_ITEM_NBT) ? ((NBTTagCompound) tag.getTag(NBT_ITEM_NBT)) : null); + } + + public static int getStored(NBTTagCompound tag) + { + return tag.getInteger(NBT_STORED); + } + + public static NBTTagCompound getBaseNBT() + { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setTag(NBT_ITEMS, new NBTTagList()); + tag.setInteger(NBT_STORED, 0); + + return tag; + } +} diff --git a/src/main/java/storagecraft/tile/TileStorage.java b/src/main/java/storagecraft/tile/TileStorage.java new file mode 100644 index 000000000..21fa5cc3a --- /dev/null +++ b/src/main/java/storagecraft/tile/TileStorage.java @@ -0,0 +1,91 @@ +package storagecraft.tile; + +import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import storagecraft.block.BlockStorage; +import storagecraft.block.EnumStorageType; +import storagecraft.storage.IStorage; +import storagecraft.storage.IStorageProvider; +import storagecraft.storage.NBTStorage; +import storagecraft.storage.StorageItem; + +public class TileStorage extends TileMachine implements IStorageProvider, IStorage +{ + public static final String STORAGE_NBT = "Storage"; + + private NBTTagCompound tag = NBTStorage.getBaseNBT(); + + @Override + public int getEnergyUsage() + { + return 1; + } + + @Override + public void updateMachine() + { + } + + @Override + public void addStorages(List storages) + { + storages.add(this); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + + if (nbt.hasKey(STORAGE_NBT)) + { + tag = nbt.getCompoundTag(STORAGE_NBT); + } + } + + public NBTStorage getStorage() + { + return new NBTStorage(tag, ((EnumStorageType) worldObj.getBlockState(pos).getValue(BlockStorage.TYPE)).getCapacity()); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + + nbt.setTag(STORAGE_NBT, tag); + } + + @Override + public void addItems(List items) + { + getStorage().addItems(items); + + markDirty(); + } + + @Override + public void push(ItemStack stack) + { + getStorage().push(stack); + + markDirty(); + } + + @Override + public ItemStack take(ItemStack stack, int flags) + { + ItemStack result = getStorage().take(stack, flags); + + markDirty(); + + return result; + } + + @Override + public boolean canPush(ItemStack stack) + { + return getStorage().canPush(stack); + } +} diff --git a/src/main/resources/assets/storagecraft/blockstates/storage.json b/src/main/resources/assets/storagecraft/blockstates/storage.json index f66d2f8d3..1df011ca8 100644 --- a/src/main/resources/assets/storagecraft/blockstates/storage.json +++ b/src/main/resources/assets/storagecraft/blockstates/storage.json @@ -63,6 +63,12 @@ } } }, + "connected": { + "true": { + }, + "false": { + } + }, "direction": { "north": { },