storage block

This commit is contained in:
Raoul Van den Berge
2016-01-31 11:54:43 +01:00
parent 5bcd1719c3
commit e54c062bc3
8 changed files with 293 additions and 157 deletions

View File

@@ -8,9 +8,11 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; 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); 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[] return new BlockState(this, new IProperty[]
{ {
DIRECTION, DIRECTION,
CONNECTED,
TYPE TYPE
}); });
} }
@@ -49,4 +52,10 @@ public class BlockStorage extends BlockBase
{ {
return ((EnumStorageType) state.getValue(TYPE)).getId(); return ((EnumStorageType) state.getValue(TYPE)).getId();
} }
@Override
public TileEntity createTileEntity(World world, IBlockState state)
{
return new TileStorage();
}
} }

View File

@@ -1,16 +1,14 @@
package storagecraft.item; package storagecraft.item;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.StatCollector; import net.minecraft.util.StatCollector;
import net.minecraft.world.World; import net.minecraft.world.World;
import storagecraft.storage.CellStorage; import storagecraft.storage.CellStorage;
import storagecraft.storage.NBTStorage;
import java.util.List;
public class ItemStorageCell extends ItemBase public class ItemStorageCell extends ItemBase
{ {
@@ -41,13 +39,13 @@ public class ItemStorageCell extends ItemBase
@Override @Override
public void addInformation(ItemStack cell, EntityPlayer player, List list, boolean b) 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 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); 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()); return stack;
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;
} }
} }

View File

@@ -3,6 +3,7 @@ package storagecraft.proxy;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.ItemModelMesher; 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.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@@ -15,6 +16,8 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import storagecraft.StorageCraftBlocks; import storagecraft.StorageCraftBlocks;
import storagecraft.StorageCraftItems; import storagecraft.StorageCraftItems;
import storagecraft.block.BlockBase;
import storagecraft.block.BlockMachine;
import storagecraft.block.EnumControllerType; import storagecraft.block.EnumControllerType;
import storagecraft.block.EnumGridType; import storagecraft.block.EnumGridType;
import storagecraft.block.EnumStorageType; import storagecraft.block.EnumStorageType;
@@ -64,6 +67,13 @@ public class ClientProxy extends CommonProxy
new ResourceLocation("storagecraft:wireless_grid_disconnected") 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); ForgeHooksClient.registerTESRItemStack(Item.getItemFromBlock(StorageCraftBlocks.CABLE), 0, TileCable.class);
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(StorageCraftBlocks.CABLE), 0, new ModelResourceLocation("storagecraft:cable", "inventory")); 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.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.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.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_1K.getId(), new ModelResourceLocation("storagecraft:storage"));
mesher.register(Item.getItemFromBlock(StorageCraftBlocks.STORAGE), EnumStorageType.TYPE_4K.getId(), new ModelResourceLocation("storagecraft:storage", "inventory")); 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", "inventory")); 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", "inventory")); 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", "inventory")); 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());
} }
} }

View File

@@ -49,6 +49,7 @@ public class CommonProxy
GameRegistry.registerTileEntity(TileWirelessTransmitter.class, "wireless_transmitter"); GameRegistry.registerTileEntity(TileWirelessTransmitter.class, "wireless_transmitter");
GameRegistry.registerTileEntity(TileDestructor.class, "destructor"); GameRegistry.registerTileEntity(TileDestructor.class, "destructor");
GameRegistry.registerTileEntity(TileConstructor.class, "constructor"); GameRegistry.registerTileEntity(TileConstructor.class, "constructor");
GameRegistry.registerTileEntity(TileStorage.class, "storage");
GameRegistry.registerBlock(StorageCraftBlocks.CONTROLLER, ItemBlockController.class, "controller"); GameRegistry.registerBlock(StorageCraftBlocks.CONTROLLER, ItemBlockController.class, "controller");
GameRegistry.registerBlock(StorageCraftBlocks.CABLE, "cable"); GameRegistry.registerBlock(StorageCraftBlocks.CABLE, "cable");

View File

@@ -1,129 +1,31 @@
package storagecraft.storage; package storagecraft.storage;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import storagecraft.item.ItemStorageCell; import storagecraft.item.ItemStorageCell;
import java.util.List; public class CellStorage extends NBTStorage
public class CellStorage 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 ItemStack cell;
public CellStorage(ItemStack cell) public CellStorage(ItemStack cell)
{ {
this.cell = cell; super(cell.getTagCompound(), getCapacity(cell));
} }
@Override public static int getCapacity(ItemStack cell)
public void addItems(List<StorageItem> items)
{ {
NBTTagList list = (NBTTagList) cell.getTagCompound().getTag(NBT_ITEMS); switch (cell.getItemDamage())
for (int i = 0; i < list.tagCount(); ++i)
{ {
items.add(createItemFromNBT(list.getCompoundTagAt(i))); case ItemStorageCell.TYPE_1K:
} return 1000;
} case ItemStorageCell.TYPE_4K:
return 4000;
@Override case ItemStorageCell.TYPE_16K:
public void push(ItemStack stack) return 16000;
{ case ItemStorageCell.TYPE_64K:
NBTTagList list = (NBTTagList) cell.getTagCompound().getTag(NBT_ITEMS); return 64000;
case ItemStorageCell.TYPE_CREATIVE:
cell.getTagCompound().setInteger(NBT_STORED, ItemStorageCell.getStored(cell) + stack.stackSize); return -1;
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(); return 0;
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);
} }
} }

View File

@@ -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<StorageItem> 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;
}
}

View File

@@ -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<IStorage> 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<StorageItem> 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);
}
}

View File

@@ -63,6 +63,12 @@
} }
} }
}, },
"connected": {
"true": {
},
"false": {
}
},
"direction": { "direction": {
"north": { "north": {
}, },