Fix OreDict filters not testing items without entries

This commit is contained in:
NotMyWing
2024-05-24 22:49:38 +11:00
parent 78c7235bea
commit a9b7faa98b
3 changed files with 23 additions and 16 deletions
@@ -19,7 +19,7 @@ import appeng.me.storage.MEInventoryHandler;
import appeng.parts.PartModel; import appeng.parts.PartModel;
import appeng.util.ConfigManager; import appeng.util.ConfigManager;
import appeng.util.Platform; import appeng.util.Platform;
import appeng.util.item.OreHelper; import appeng.util.item.OreDictFilterMatcher;
import appeng.util.prioritylist.IPartitionList; import appeng.util.prioritylist.IPartitionList;
import appeng.util.prioritylist.OreDictPriorityList; import appeng.util.prioritylist.OreDictPriorityList;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -51,7 +51,9 @@ public class PartOreDicStorageBus extends PartStorageBus {
public void readFromNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data); super.readFromNBT(data);
this.oreExp = data.getString("oreMatch"); this.oreExp = data.getString("oreMatch");
this.priorityList = new OreDictPriorityList<>(OreHelper.INSTANCE.getMatchingOre(oreExp), oreExp);
var rulesList = OreDictFilterMatcher.parseExpression(oreExp);
this.priorityList = new OreDictPriorityList<>(rulesList);
} }
@Override @Override
@@ -148,7 +150,8 @@ public class PartOreDicStorageBus extends PartStorageBus {
private IPartitionList<IAEItemStack> getPriorityList() { private IPartitionList<IAEItemStack> getPriorityList() {
if (priorityList == null) { if (priorityList == null) {
this.priorityList = new OreDictPriorityList<>(OreHelper.INSTANCE.getMatchingOre(oreExp), oreExp); var ruleList = OreDictFilterMatcher.parseExpression(oreExp);
priorityList = new OreDictPriorityList<>(ruleList);
} }
return priorityList; return priorityList;
} }
@@ -164,7 +167,8 @@ public class PartOreDicStorageBus extends PartStorageBus {
if (!this.oreExp.equals(oreMatch)) { if (!this.oreExp.equals(oreMatch)) {
this.oreExp = oreMatch; this.oreExp = oreMatch;
this.priorityList = new OreDictPriorityList<>(OreHelper.INSTANCE.getMatchingOre(oreExp), oreExp); var ruleList = OreDictFilterMatcher.parseExpression(oreMatch);
this.priorityList = new OreDictPriorityList<>(ruleList);
this.resetCache(true); this.resetCache(true);
this.getHost().markForSave(); this.getHost().markForSave();
} }
@@ -130,10 +130,9 @@ public class OreHelper {
}).orElse(false); }).orElse(false);
} }
public Set<Integer> getMatchingOre(String oreExp) { public Set<Integer> getMatchingOre(List<OreDictFilterMatcher.MatchRule> rulesList) {
Set<Integer> matchingIds = new HashSet<>(); Set<Integer> matchingIds = new HashSet<>();
List<OreDictFilterMatcher.MatchRule> rulesList = OreDictFilterMatcher.parseExpression(oreExp);
for (String ore : OreDictionary.getOreNames()) { for (String ore : OreDictionary.getOreNames()) {
if (ore == null) { if (ore == null) {
continue; continue;
@@ -2,29 +2,33 @@ package appeng.util.prioritylist;
import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IAEStack;
import appeng.util.item.AEItemStack; import appeng.util.item.AEItemStack;
import appeng.util.item.OreDictFilterMatcher;
import appeng.util.item.OreDictFilterMatcher.MatchRule;
import appeng.util.item.OreHelper;
import appeng.util.item.OreReference; import appeng.util.item.OreReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Set; import java.util.Set;
public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionList<T> { public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionList<T> {
private final Set<Integer> oreIDs; private final Set<Integer> oreIDs;
private final String oreMatch; private final boolean matchesEmptyOreDict;
public OreDictPriorityList(Set<Integer> oreIDs, String oreMatch) { public OreDictPriorityList(List<MatchRule> oreMatch) {
this.oreIDs = oreIDs; this.oreIDs = OreHelper.INSTANCE.getMatchingOre(oreMatch);
this.oreMatch = oreMatch; this.matchesEmptyOreDict = OreDictFilterMatcher.matches(oreMatch, "");
} }
@Override @Override
public boolean isListed(final T input) { public boolean isListed(final T input) {
OreReference or = ((AEItemStack) input).getOre().orElse(null); OreReference or = ((AEItemStack) input).getOre().orElse(null);
if (or != null) { if (or == null) return matchesEmptyOreDict;
for (Integer oreID : or.getOres()) {
if (this.oreIDs.contains(oreID)) { for (Integer oreID : or.getOres()) {
return true; if (this.oreIDs.contains(oreID)) {
} return true;
} }
} }
return false; return false;
@@ -32,7 +36,7 @@ public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionLis
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
return oreMatch.equals(""); return oreIDs.isEmpty();
} }
@Override @Override