From f83fa3ffa7942a892530d8ad05957667cdbc3fb3 Mon Sep 17 00:00:00 2001 From: Lex Date: Sun, 27 Dec 2020 13:55:03 +0700 Subject: [PATCH] Refactored Oredictionary export bus to use internal AE item stack hash --- .../extracells/part/PartOreDictExporter.java | 95 +++++++------------ 1 file changed, 36 insertions(+), 59 deletions(-) diff --git a/src/main/scala/extracells/part/PartOreDictExporter.java b/src/main/scala/extracells/part/PartOreDictExporter.java index 7fefd8e..c0ce09c 100644 --- a/src/main/scala/extracells/part/PartOreDictExporter.java +++ b/src/main/scala/extracells/part/PartOreDictExporter.java @@ -15,6 +15,7 @@ import appeng.api.parts.IPartRenderHelper; import appeng.api.storage.IMEMonitor; import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.api.util.AEColor; import appeng.util.item.AEItemStack; import cpw.mods.fml.relauncher.Side; @@ -37,9 +38,7 @@ import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -49,12 +48,7 @@ public class PartOreDictExporter extends PartECBase implements IGridTickable { private String filter = ""; - // disabled - // private Predicate filterPredicate = null; - /** - * White list of itemstacks to extract. OreDict only mode. - */ - private ItemStack[] oreDictFilteredItems = new ItemStack[0]; + private Predicate filterPredicate = null; @Override public int cableConnectionRenderTo() { @@ -70,16 +64,37 @@ public void setFilter(String filter) { updateFilter(); saveData(); } - + private static class OreListMatcher implements Predicate { + HashSet ores = new HashSet<>(); + public OreListMatcher(ArrayList input){ + for (ItemStack is: input) + ores.add(AEItemStack.create(is)); + } + public boolean test(AEItemStack t) { + return ores.contains(t); + } + } /** * Call when the filter string has changed to parse and recompile the filter. */ private void updateFilter() { Predicate matcher = null; - if (filter.contains("\\") || filter.contains("^") || filter.contains("$") || filter.contains("+") || filter.contains("(") || filter.contains(")") || filter.contains("[") || filter.contains("]")) { + if (filter.contains("\\") + || filter.contains("^") + || filter.contains("$") + || filter.contains("+") + || filter.contains("(") + || filter.contains(")") + || filter.contains("[") + || filter.contains("]")) + { final Predicate test = Pattern.compile(filter).asPredicate(); - matcher = (is) -> is != null && IntStream.of(OreDictionary.getOreIDs(is)).mapToObj(OreDictionary::getOreName).anyMatch(test); - } else if (!this.filter.trim().isEmpty()) { + matcher = (is) -> is != null && + IntStream.of(OreDictionary.getOreIDs(is)) + .mapToObj(OreDictionary::getOreName) + .anyMatch(test); + } + else if (!this.filter.trim().isEmpty()) { String[] filters = this.filter.split("[&|]"); String lastFilter = null; @@ -113,19 +128,15 @@ private void updateFilter() { // Mod name and path evaluation are disabled in this version if (matcher != null && !this.filter.contains("@") && !this.filter.contains("~")) { - //Precompiled whitelist of oredict itemstacks. ArrayList filtered = new ArrayList<>(); for (String name : OreDictionary.getOreNames()) for (ItemStack s : OreDictionary.getOres(name)) - if (matcher.test(s)) { + if (matcher.test(s)) filtered.add(s); - } - oreDictFilteredItems = filtered.toArray(oreDictFilteredItems); - - } else { - // mod filtering disabled - this.oreDictFilteredItems = new ItemStack[0]; + filterPredicate = new OreListMatcher(filtered); } + else + filterPredicate = null; } /** @@ -135,27 +146,11 @@ private void updateFilter() { * @return Predicate for filter string. */ private Predicate filterToItemStackPredicate(String filter) { - /*if (filter.startsWith("@")) { - final Predicate test = filterToPredicate(filter.substring(1)); - return (is) -> is != null && - Optional.ofNullable(is.getItem(). getRegistryName()) - .map(ResourceLocation::getResourceDomain) - .map(test::test) - .orElse(false); - } else if (filter.startsWith("~")) { - final Predicate test = filterToPredicate(filter.substring(1)); - return (is) -> is != null && - Optional.ofNullable(is.getItem().getRegistryName()) - .map(ResourceLocation::getPath) - .map(test::test) - .orElse(false); - } else {*/ final Predicate test = filterToPredicate(filter); return (is) -> is != null && IntStream.of(OreDictionary.getOreIDs(is)) .mapToObj(OreDictionary::getOreName) .anyMatch(test); - //} } /** @@ -194,14 +189,15 @@ public boolean doWork(int rate, int ticksSinceLastCall) { IMEMonitor inv = storage.getItemInventory(); MachineSource src = new MachineSource(this); -/* if (this.filterPredicate != null) { - //Tick-time filter evaluation. + if (this.filterPredicate != null) { IItemList items = inv.getStorageList(); for (IAEItemStack stack : items) { - if (stack == null || !this.filterPredicate.test(stack.createItemStack())) + if (stack == null || !this.filterPredicate.test((AEItemStack)stack)) continue; + IAEItemStack toExtract = stack.copy(); toExtract.setStackSize(amount); + IAEItemStack extracted = inv.extractItems(toExtract, Actionable.SIMULATE, src); if (extracted != null) { IAEItemStack exported = exportStack(extracted.copy()); @@ -211,27 +207,8 @@ public boolean doWork(int rate, int ticksSinceLastCall) { } } } - return false; - } else {*/ - //Precompiled oredict whitelist - for (ItemStack is : this.oreDictFilteredItems) { - if (is == null || amount == 0) - continue; - - ItemStack toExtract = is.copy(); - toExtract.stackSize = amount; - - IAEItemStack extracted = inv.extractItems(AEItemStack.create(toExtract), Actionable.SIMULATE, src); - if (extracted != null) { - IAEItemStack exported = exportStack(extracted.copy()); - if (exported != null) { - inv.extractItems(exported, Actionable.MODULATE, src); - return true; - } - } } return false; - //} } public IAEItemStack exportStack(IAEItemStack stack0) {