package appeng.helpers; import appeng.core.AEConfig; import appeng.core.AELog; import appeng.util.Platform; import gregtech.api.items.metaitem.MetaItem; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; import java.util.HashMap; import java.util.Map; public class NonBlockingItems { public static Map> NON_BLOCKING_MAP = new HashMap<>(); public static NonBlockingItems INSTANCE = new NonBlockingItems(); private NonBlockingItems() { String[] strings = AEConfig.instance().getNonBlockingItems(); String[] modids = new String[0]; for (String s : strings) { if (s.startsWith("[") && s.endsWith("]")) { modids = s.substring(1, s.length() - 1).split("\\|"); } else { for (String modid : modids) { if (!Platform.isModLoaded(modid)) { continue; } NON_BLOCKING_MAP.putIfAbsent(modid, new Object2ObjectOpenHashMap<>()); String[] ModItemMeta = s.split(":"); if (ModItemMeta.length < 2 || ModItemMeta.length > 3) { AELog.error("Invalid non blocking item entry: " + s); continue; } if (ModItemMeta[0].equals("gregtech") && Platform.GTLoaded) { boolean found = false; for (MetaItem metaItem : MetaItem.getMetaItems()) { MetaItem.MetaValueItem metaItem2 = metaItem.getItem(ModItemMeta[1]); if (metaItem.getItem(ModItemMeta[1]) != null) { found = true; ItemStack itemStack = metaItem2.getStackForm(); NON_BLOCKING_MAP.get(modid).putIfAbsent(itemStack.getItem(), new IntOpenHashSet()); NON_BLOCKING_MAP.get(modid).computeIfPresent(itemStack.getItem(), (item, intSet) -> { intSet.add(itemStack.getItemDamage()); return intSet; }); } else { ItemStack itemStack = GameRegistry.makeItemStack(ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt(ModItemMeta[2]) : 0, 1, null); if (!itemStack.isEmpty()) { NON_BLOCKING_MAP.get(modid).putIfAbsent(itemStack.getItem(), new IntOpenHashSet()); NON_BLOCKING_MAP.get(modid).computeIfPresent(itemStack.getItem(), (item, intSet) -> { intSet.add(itemStack.getItemDamage()); return intSet; }); } } } if (!found) { AELog.error("Item not found on nonBlocking config: " + s); } } else if (ModItemMeta[0].equals("ore")) { OreDictionary.getOres(ModItemMeta[1]).forEach(itemStack -> { NON_BLOCKING_MAP.get(modid).putIfAbsent(itemStack.getItem(), new IntOpenHashSet()); NON_BLOCKING_MAP.get(modid).computeIfPresent(itemStack.getItem(), (item, intSet) -> { intSet.add(itemStack.getItemDamage()); return intSet; }); }); } else { ItemStack itemStack = GameRegistry.makeItemStack(ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt(ModItemMeta[2]) : 0, 1, null); if (!itemStack.isEmpty()) { NON_BLOCKING_MAP.get(modid).putIfAbsent(itemStack.getItem(), new IntOpenHashSet()); NON_BLOCKING_MAP.get(modid).computeIfPresent(itemStack.getItem(), (item, intSet) -> { intSet.add(itemStack.getItemDamage()); return intSet; }); } else { AELog.error("Item not found on nonBlocking config: " + s); } } } } } } public Map> getMap() { return NON_BLOCKING_MAP; } public void init() { } }