package advancedsystemsmanager.flow.setting;
import advancedsystemsmanager.flow.menus.MenuItem;
import advancedsystemsmanager.helpers.ModItemHelper;
import advancedsystemsmanager.network.ASMPacket;
import advancedsystemsmanager.reference.Names;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.List;
public class ItemSetting extends Setting<ItemStack>
{
public static final String NBT_SETTING_FUZZY = "FuzzyMode";
public FuzzyMode fuzzyMode;
public ItemStack content;
public ItemSetting(int id)
{
super(id);
}
@Override
public void clear()
{
super.clear();
fuzzyMode = FuzzyMode.PRECISE;
content = null;
}
@Override
public List<String> getMouseOver()
{
if (content != null && GuiScreen.isShiftKeyDown())
{
return MenuItem.getToolTip(content);
}
List<String> ret = new ArrayList<String>();
if (content == null)
{
ret.add(Names.NO_ITEM_SELECTED);
} else
{
ret.add(MenuItem.getDisplayName(content));
}
ret.add("");
ret.add(Names.CHANGE_ITEM);
if (content != null)
{
ret.add(Names.EDIT_SETTING);
ret.add(Names.FULL_DESCRIPTION);
}
return ret;
}
@Override
public int getDefaultAmount()
{
return 1;
}
@Override
public ItemStack getContent()
{
return content;
}
@Override
public boolean isValid()
{
return content != null;
}
@Override
public void setFuzzyType(int id)
{
fuzzyMode = FuzzyMode.values()[id];
}
@Override
public void copyFrom(Setting setting)
{
content = ((ItemSetting)setting).getItem().copy();
fuzzyMode = ((ItemSetting)setting).fuzzyMode;
}
public ItemStack getItem()
{
return content;
}
@Override
public void load(NBTTagCompound settingTag)
{
super.load(settingTag);
content = ItemStack.loadItemStackFromNBT(settingTag);
fuzzyMode = FuzzyMode.values()[settingTag.getByte(NBT_SETTING_FUZZY)];
}
@Override
public void save(NBTTagCompound settingTag)
{
super.save(settingTag);
if (content != null) content.writeToNBT(settingTag);
settingTag.setByte(NBT_SETTING_FUZZY, (byte)fuzzyMode.ordinal());
}
@Override
public void setContent(ItemStack obj)
{
content = obj.copy();
}
@Override
public boolean isContentEqual(ItemStack check)
{
return isEqualForCommandExecutor(check);
}
public boolean isEqualForCommandExecutor(ItemStack other)
{
if (!isValid() || other == null)
{
return false;
} else
{
switch (fuzzyMode)
{
case ORE_DICTIONARY:
int[] ids = OreDictionary.getOreIDs(this.getItem());
if (ids.length > 0)
{
int[] otherIds = OreDictionary.getOreIDs(other);
for (int id : ids)
{
for (int oId : otherIds)
{
if (id == oId) return true;
}
}
}
//note that this falls through into the precise one, this is on purpose
case PRECISE:
return this.getItem().getItem() == other.getItem() && this.getItem().getItemDamage() == other.getItemDamage() && ItemStack.areItemStackTagsEqual(getItem(), other);
case NBT_FUZZY:
return this.getItem().getItem() == other.getItem() && this.getItem().getItemDamage() == other.getItemDamage();
case FUZZY:
return this.getItem().getItem() == other.getItem();
case MOD_GROUPING:
return ModItemHelper.areItemsFromSameMod(this.getItem().getItem(), other.getItem());
case ALL:
return true;
default:
return false;
}
}
}
@Override
public void writeContentData(ASMPacket packet)
{
super.writeContentData(packet);
packet.writeItemStackToBuffer(content);
}
@Override
public void readContentData(ASMPacket packet)
{
super.readContentData(packet);
content = packet.readItemStackFromBuffer();
}
public FuzzyMode getFuzzyMode()
{
return fuzzyMode;
}
public boolean canChangeMetaData()
{
return true;
}
}