use of mekanism.common.content.qio.IQIODriveItem in project Mekanism by mekanism.
the class RecipeUpgradeData method getSupportedTypes.
@Nonnull
static Set<RecipeUpgradeType> getSupportedTypes(ItemStack stack) {
// TODO: Add more types of data that can be transferred such as side configs, auto sort, bucket mode, dumping mode
if (stack.isEmpty()) {
return Collections.emptySet();
}
Set<RecipeUpgradeType> supportedTypes = EnumSet.noneOf(RecipeUpgradeType.class);
Item item = stack.getItem();
TileEntityMekanism tile = null;
if (item instanceof BlockItem) {
Block block = ((BlockItem) item).getBlock();
if (block instanceof IHasTileEntity) {
TileEntity tileEntity = ((IHasTileEntity<?>) block).getTileType().create();
if (tileEntity instanceof TileEntityMekanism) {
tile = (TileEntityMekanism) tileEntity;
}
}
if (Attribute.has(block, AttributeUpgradeSupport.class)) {
supportedTypes.add(RecipeUpgradeType.UPGRADE);
}
}
if (stack.getCapability(Capabilities.STRICT_ENERGY_CAPABILITY).isPresent() || tile != null && tile.handles(SubstanceType.ENERGY)) {
// If we are for a block that handles energy, or we have an energy handler capability
supportedTypes.add(RecipeUpgradeType.ENERGY);
}
if (FluidUtil.getFluidHandler(stack).isPresent() || tile != null && tile.handles(SubstanceType.FLUID)) {
// If we are for a block that handles fluid, or we have a fluid handler capability
supportedTypes.add(RecipeUpgradeType.FLUID);
}
if (stack.getCapability(Capabilities.GAS_HANDLER_CAPABILITY).isPresent() || tile != null && tile.handles(SubstanceType.GAS)) {
// If we are for a block that handles gas, or we have a gas handler capability
supportedTypes.add(RecipeUpgradeType.GAS);
}
if (stack.getCapability(Capabilities.INFUSION_HANDLER_CAPABILITY).isPresent() || tile != null && tile.handles(SubstanceType.INFUSION)) {
// If we are for a block that handles infusion, or we have an infusion handler capability
supportedTypes.add(RecipeUpgradeType.INFUSION);
}
if (stack.getCapability(Capabilities.PIGMENT_HANDLER_CAPABILITY).isPresent() || tile != null && tile.handles(SubstanceType.PIGMENT)) {
// If we are for a block that handles pigment, or we have a pigment handler capability
supportedTypes.add(RecipeUpgradeType.PIGMENT);
}
if (stack.getCapability(Capabilities.SLURRY_HANDLER_CAPABILITY).isPresent() || tile != null && tile.handles(SubstanceType.SLURRY)) {
// If we are for a block that handles slurry, or we have a slurry handler capability
supportedTypes.add(RecipeUpgradeType.SLURRY);
}
if (item instanceof ISustainedInventory || tile != null && tile.persistInventory()) {
supportedTypes.add(RecipeUpgradeType.ITEM);
}
if (item instanceof ISecurityItem) {
supportedTypes.add(RecipeUpgradeType.SECURITY);
}
if (item instanceof IQIODriveItem) {
supportedTypes.add(RecipeUpgradeType.QIO_DRIVE);
}
return supportedTypes;
}
use of mekanism.common.content.qio.IQIODriveItem in project Mekanism by mekanism.
the class RecipeUpgradeData method getUpgradeData.
/**
* Make sure to validate with getSupportedTypes before calling this
*/
@Nullable
static RecipeUpgradeData<?> getUpgradeData(@Nonnull RecipeUpgradeType type, @Nonnull ItemStack stack) {
Item item = stack.getItem();
switch(type) {
case ENERGY:
return new EnergyRecipeData(ItemDataUtils.getList(stack, NBTConstants.ENERGY_CONTAINERS));
case FLUID:
return new FluidRecipeData(ItemDataUtils.getList(stack, NBTConstants.FLUID_TANKS));
case GAS:
return new GasRecipeData(ItemDataUtils.getList(stack, NBTConstants.GAS_TANKS));
case INFUSION:
return new InfusionRecipeData(ItemDataUtils.getList(stack, NBTConstants.INFUSION_TANKS));
case PIGMENT:
return new PigmentRecipeData(ItemDataUtils.getList(stack, NBTConstants.PIGMENT_TANKS));
case SLURRY:
return new SlurryRecipeData(ItemDataUtils.getList(stack, NBTConstants.SLURRY_TANKS));
case ITEM:
return new ItemRecipeData(((ISustainedInventory) item).getInventory(stack));
case SECURITY:
ISecurityItem securityItem = (ISecurityItem) item;
UUID ownerUUID = securityItem.getOwnerUUID(stack);
return ownerUUID == null ? null : new SecurityRecipeData(ownerUUID, securityItem.getSecurity(stack));
case UPGRADE:
CompoundNBT componentUpgrade = ItemDataUtils.getCompound(stack, NBTConstants.COMPONENT_UPGRADE);
return componentUpgrade.isEmpty() ? null : new UpgradesRecipeData(Upgrade.buildMap(componentUpgrade));
case QIO_DRIVE:
DriveMetadata data = DriveMetadata.load(stack);
if (data.getCount() > 0 && ((IQIODriveItem) item).hasStoredItemMap(stack)) {
// If we don't have any stored items don't actually grab any recipe data
return new QIORecipeData(data, ItemDataUtils.getList(stack, NBTConstants.QIO_ITEM_MAP));
}
break;
}
return null;
}
use of mekanism.common.content.qio.IQIODriveItem in project Mekanism by mekanism.
the class QIORecipeData method applyToStack.
@Override
public boolean applyToStack(ItemStack stack) {
IQIODriveItem driveItem = (IQIODriveItem) stack.getItem();
if (itemCount > driveItem.getCountCapacity(stack) || itemMap.size() > driveItem.getTypeCapacity(stack)) {
// then return that we are not able to actually apply them to the stack
return false;
}
ListNBT list = new ListNBT();
for (Entry<HashedItem> entry : itemMap.object2LongEntrySet()) {
CompoundNBT tag = new CompoundNBT();
tag.put(NBTConstants.ITEM, entry.getKey().getStack().save(new CompoundNBT()));
tag.putLong(NBTConstants.AMOUNT, entry.getLongValue());
list.add(tag);
}
ItemDataUtils.setList(stack, NBTConstants.QIO_ITEM_MAP, list);
DriveMetadata meta = new DriveMetadata(itemCount, itemMap.size());
meta.write(stack);
return true;
}
Aggregations