/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.util;
import matteroverdrive.api.matter.IMatterDatabase;
import matteroverdrive.api.matter.IMatterPatternStorage;
import matteroverdrive.data.ItemPattern;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
public class MatterDatabaseHelper
{
public static final int MAX_ITEM_PROGRESS = 100;
public static final String PROGRESS_TAG_NAME = "scan_progress";
public static final String ITEMS_TAG_NAME = "items";
public static final String CAPACITY_TAG_NAME = "Capacity";
public static void initTagCompound(ItemStack scanner)
{
NBTTagCompound tagCompound = new NBTTagCompound();
scanner.setTagCompound(tagCompound);
initItemListTagCompound(scanner);
}
public static void initItemListTagCompound(ItemStack scanner)
{
NBTTagList items = new NBTTagList();
scanner.setTagInfo(ITEMS_TAG_NAME, items);
}
public static int getPatternCapacity(ItemStack storage)
{
if (storage.getTagCompound() != null)
{
return storage.getTagCompound().getShort(MatterDatabaseHelper.CAPACITY_TAG_NAME);
}
return 0;
}
public static boolean hasFreeSpace(ItemStack storage)
{
if (storage != null)
{
if(MatterHelper.isMatterPatternStorage(storage))
{
ItemPattern[] patterns = getPatternsFromStorage(storage);
if (patterns.length < MatterDatabaseHelper.getPatternCapacity(storage))
{
return true;
}
}
}
return false;
}
public static ItemStack getFirstFreePatternStorage(IMatterDatabase database)
{
ItemStack[] patternStorages = database.getPatternStorageList();
for (int i = 0;i < patternStorages.length;i++)
{
if (patternStorages[i] != null)
{
if (hasFreeSpace(patternStorages[i]))
{
return patternStorages[i];
}
}
}
return null;
}
public static boolean HasItem(ItemStack storage,ItemStack item)
{
ItemPattern[] patterns = getPatternsFromStorage(storage);
for (int i = 0;i < patterns.length;i++)
{
if (areEqual(item,patterns[i].toItemStack(false)))
{
return true;
}
}
return false;
}
public static void addProgressToPatternStorage(ItemStack patternStorage, ItemStack item, int progress,boolean existingOnly)
{
if (!patternStorage.hasTagCompound()) {
initItemListTagCompound(patternStorage);
}
NBTTagList patternsTagList = patternStorage.getTagCompound().getTagList(ITEMS_TAG_NAME, Constants.NBT.TAG_COMPOUND);
for (int i = 0;i < patternsTagList.tagCount();i++)
{
ItemPattern pattern = new ItemPattern(patternsTagList.getCompoundTagAt(i));
if (areEqual(pattern.toItemStack(false),item))
{
int oldProgress = patternsTagList.getCompoundTagAt(i).getByte(PROGRESS_TAG_NAME);
patternsTagList.getCompoundTagAt(i).setByte(PROGRESS_TAG_NAME,(byte) MathHelper.clamp_int(oldProgress + progress,0,MAX_ITEM_PROGRESS));
return;
}
}
if (!existingOnly)
{
ItemPattern pattern = new ItemPattern(item, progress);
NBTTagCompound patternTag = new NBTTagCompound();
pattern.writeToNBT(patternTag);
patternsTagList.appendTag(patternTag);
}
}
public static int getItemStackProgress(ItemStack storage, ItemStack item)
{
ItemPattern itemPattern = getPatternFromStorage(storage,item);
if (itemPattern != null)
{
return itemPattern.getProgress();
}
return -1;
}
public static ItemPattern getPatternFromStorage(ItemStack patternStorage, ItemStack item)
{
ItemPattern[] patterns = getPatternsFromStorage(patternStorage);
for (int i = 0; i < patterns.length; i++) {
if (areEqual(item, patterns[i].toItemStack(false)))
return patterns[i];
}
return null;
}
public static ItemPattern getPatternWithItemID(ItemStack patternStorage, int id)
{
ItemPattern[] patterns = getPatternsFromStorage(patternStorage);
for (int i = 0; i < patterns.length; i++) {
if (patterns[i].getItemID() == id)
return patterns[i];
}
return null;
}
private static ItemPattern getPatternAt(ItemStack patternStorage, int index)
{
ItemPattern itemPattern[] = getPatternsFromStorage(patternStorage);
return itemPattern[index];
}
public static boolean areEqual(ItemStack one,ItemStack two)
{
if(one != null && two != null)
{
if(one.getItem() == two.getItem())
{
if(one.getHasSubtypes() && two.getHasSubtypes())
{
if(one.getItemDamage() == two.getItemDamage())
{
return true;
}
}
else
{
return true;
}
}
}
return false;
}
public static boolean areEqual(NBTTagCompound one,NBTTagCompound two)
{
if(one == null || two == null)
return false;
return areEqual(ItemStack.loadItemStackFromNBT(one),ItemStack.loadItemStackFromNBT(two));
}
public static ItemPattern[] getPatternsFromStorage(ItemStack patternStorage)
{
if (patternStorage.getItem() instanceof IMatterPatternStorage)
{
return ((IMatterPatternStorage) patternStorage.getItem()).getPatterns(patternStorage);
}
return null;
}
public static ItemStack GetItemStackFromWorld(World world,int x, int y,int z)
{
Block b = world.getBlock(x, y, z);
if(b != null && Item.getItemFromBlock(b) != null)
{
//Item bi = Item.getItemFromBlock(b);
//List subBlocks = new ArrayList();
//b.getSubBlocks(bi, null, subBlocks);
int meta = world.getBlockMetadata(x, y, z);
return new ItemStack(b,1,b.damageDropped(meta));
}
return new ItemStack(b);
}
public static EnumChatFormatting getPatternInfoColor(int progress)
{
EnumChatFormatting color = EnumChatFormatting.GRAY;
if (progress > 0 && progress <= 20)
color = EnumChatFormatting.RED;
else if (progress > 20 && progress <= 40)
color = EnumChatFormatting.GOLD;
else if (progress > 40 && progress <= 60)
color = EnumChatFormatting.YELLOW;
else if (progress > 40 && progress <= 80)
color = EnumChatFormatting.AQUA;
else if (progress > 80 && progress <= 100)
color = EnumChatFormatting.GREEN;
else
color = EnumChatFormatting.GREEN;
return color;
}
}