package advancedsystemsmanager.threading;
import advancedsystemsmanager.AdvancedSystemsManager;
import advancedsystemsmanager.flow.elements.ScrollController;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class SearchItems implements Runnable
{
public static List<SearchEntry> searchEntries = new ArrayList<SearchEntry>();
public static List<SearchEntry> searchBlocks = new ArrayList<SearchEntry>();
private long time;
private String search;
private ScrollController controller;
private boolean showAll;
private boolean justBlocks;
private List<ItemStack> items = new ArrayList<ItemStack>();
public SearchItems(String search, ScrollController controller, boolean showAll)
{
this(search, controller, showAll, false);
}
public SearchItems(String search, ScrollController controller, boolean showAll, boolean blocks)
{
this.search = search;
this.controller = controller;
this.showAll = showAll;
this.justBlocks = blocks;
this.time = System.currentTimeMillis();
}
public static void setItems()
{
searchBlocks.clear();
searchEntries.clear();
Thread search = new Thread(new CacheItems());
search.setName("ASM-item_cache");
search.start();
}
@Override
public void run()
{
if (search.equals(".inv"))
{
InventoryPlayer inventory = Minecraft.getMinecraft().thePlayer.inventory;
for (int itemStack = 0; itemStack < inventory.getSizeInventory(); ++itemStack)
{
ItemStack stack = inventory.getStackInSlot(itemStack);
if (stack != null && (!justBlocks || stack.getItem() instanceof ItemBlock))
{
stack = stack.copy();
stack.stackSize = 1;
items.add(stack);
}
}
} else
{
List<SearchEntry> toSearch = justBlocks ? searchBlocks : searchEntries;
if (!showAll)
{
Pattern pattern = Pattern.compile(Pattern.quote(search), Pattern.CASE_INSENSITIVE);
boolean advanced = Minecraft.getMinecraft().gameSettings.advancedItemTooltips;
for (SearchEntry entry : toSearch) entry.search(pattern, items, advanced);
} else
{
for (SearchEntry entry : toSearch) items.add(entry.getStack());
}
}
if (time > controller.getLastUpdate())
ThreadSafeHandler.handle(this);
}
public void setResult()
{
controller.result = items;
controller.lastUpdate = time;
}
public ScrollController getScrollController()
{
return controller;
}
public long getTime()
{
return time;
}
public static class CacheItems implements Runnable
{
@Override
public void run()
{
long time = System.currentTimeMillis();
List<ItemStack> stacks = new ArrayList<ItemStack>();
for (Object anItemRegistry : Item.itemRegistry)
{
try
{
Item item = (Item)anItemRegistry;
item.getSubItems(item, item.getCreativeTab(), stacks);
} catch (Exception ignore)
{
}
}
for (ItemStack stack : stacks)
{
SearchEntry entry = getSearch(stack);
if (entry != null)
{
searchEntries.add(entry);
if (stack.getItem() instanceof ItemBlock)
{
searchBlocks.add(entry);
}
}
}
AdvancedSystemsManager.log.info("Search database generated in " + (System.currentTimeMillis() - time) + "ms");
}
public SearchEntry getSearch(ItemStack stack)
{
try
{
List tooltipList = stack.getTooltip(Minecraft.getMinecraft().thePlayer, false);
List advTooltipList = stack.getTooltip(Minecraft.getMinecraft().thePlayer, true);
String searchString = "";
for (Object string : tooltipList)
{
if (string != null)
searchString += string + "\n";
}
String advSearchString = "";
for (Object string : advTooltipList)
{
if (string != null)
advSearchString += string + "\n";
}
return new SearchEntry(searchString, advSearchString, stack);
} catch (Throwable ignore)
{
}
return null;
}
}
public static class SearchEntry
{
private String toolTip;
private String advToolTip;
private ItemStack stack;
public SearchEntry(String searchString, String advSearchString, ItemStack stack)
{
this.toolTip = searchString;
this.advToolTip = advSearchString;
this.stack = stack;
}
public void search(Pattern pattern, List<ItemStack> stacks, boolean advanced)
{
if (pattern.matcher(advanced ? advToolTip : toolTip).find()) stacks.add(stack);
}
public ItemStack getStack()
{
return stack;
}
}
}