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.util.ConfigManager;
import appeng.util.Platform;
import appeng.util.item.OreHelper;
import appeng.util.item.OreDictFilterMatcher;
import appeng.util.prioritylist.IPartitionList;
import appeng.util.prioritylist.OreDictPriorityList;
import net.minecraft.entity.player.EntityPlayer;
@@ -51,7 +51,9 @@ public class PartOreDicStorageBus extends PartStorageBus {
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
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
@@ -148,7 +150,8 @@ public class PartOreDicStorageBus extends PartStorageBus {
private IPartitionList<IAEItemStack> getPriorityList() {
if (priorityList == null) {
this.priorityList = new OreDictPriorityList<>(OreHelper.INSTANCE.getMatchingOre(oreExp), oreExp);
var ruleList = OreDictFilterMatcher.parseExpression(oreExp);
priorityList = new OreDictPriorityList<>(ruleList);
}
return priorityList;
}
@@ -164,7 +167,8 @@ public class PartOreDicStorageBus extends PartStorageBus {
if (!this.oreExp.equals(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.getHost().markForSave();
}
@@ -130,10 +130,9 @@ public class OreHelper {
}).orElse(false);
}
public Set<Integer> getMatchingOre(String oreExp) {
public Set<Integer> getMatchingOre(List<OreDictFilterMatcher.MatchRule> rulesList) {
Set<Integer> matchingIds = new HashSet<>();
List<OreDictFilterMatcher.MatchRule> rulesList = OreDictFilterMatcher.parseExpression(oreExp);
for (String ore : OreDictionary.getOreNames()) {
if (ore == null) {
continue;
@@ -2,37 +2,41 @@ package appeng.util.prioritylist;
import appeng.api.storage.data.IAEStack;
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 java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionList<T> {
private final Set<Integer> oreIDs;
private final String oreMatch;
private final boolean matchesEmptyOreDict;
public OreDictPriorityList(Set<Integer> oreIDs, String oreMatch) {
this.oreIDs = oreIDs;
this.oreMatch = oreMatch;
public OreDictPriorityList(List<MatchRule> oreMatch) {
this.oreIDs = OreHelper.INSTANCE.getMatchingOre(oreMatch);
this.matchesEmptyOreDict = OreDictFilterMatcher.matches(oreMatch, "");
}
@Override
public boolean isListed(final T input) {
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)) {
return true;
}
}
}
return false;
}
@Override
public boolean isEmpty() {
return oreMatch.equals("");
return oreIDs.isEmpty();
}
@Override