From 15317c96b55974676dea3a303104924677f47f1c Mon Sep 17 00:00:00 2001 From: Aquaholic Date: Tue, 16 Dec 2025 14:50:23 +0800 Subject: [PATCH 1/4] Keep a HashSet of the filter for Pastel Nodes to speed up filtering, as well as a private field to keep track of if any NBT or tag checking is occurring. --- .../nodes/PastelNodeBlockEntity.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index f08aa43cae..24f1d24ebd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -75,6 +75,8 @@ public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigur protected Direction cachedDirection = null; private final List filterItems; + private final HashSet filterHashset = new HashSet<>(10); + private int nbtCheckingFilterItems = 0; float rotationTarget, crystalRotation, lastRotationTarget, heightTarget, crystalHeight, lastHeightTarget, alphaTarget, ringAlpha, lastAlphaTarget; long creationStamp = -1, interpTicks, interpLength = -1, spinTicks; private State state; @@ -250,6 +252,7 @@ public void updateUpgrades() { if (filterSlotRows < oldFilterSlotCount) { for (int i = getDrawnSlots(); i < filterItems.size(); i++) { + filterHashset.remove(filterItems.get(i).getItem()); filterItems.set(i, ItemVariant.blank()); } } @@ -351,6 +354,11 @@ public void readNbt(NbtCompound nbt) { if (this.getNodeType().usesFilters()) { FilterConfigurable.readFilterNbt(nbt, this.filterItems); + this.filterHashset.clear(); + this.filterItems.forEach((itemVariant) -> { + this.filterHashset.add(itemVariant.getItem()); + this.updateNbtCheckingCount(itemVariant, 1); + }); } } @@ -450,9 +458,23 @@ public List getItemFilters() { @Override public void setFilterItem(int slot, ItemVariant item) { + System.out.printf("Current NBT filtering items: %s\n", this.nbtCheckingFilterItems); + updateNbtCheckingCount(item, 1); + updateNbtCheckingCount(this.filterItems.get(slot), -1); + if(Collections.frequency(this.filterItems, item) == 1) { this.filterHashset.remove(this.filterItems.get(slot).getItem()); } this.filterItems.set(slot, item); + this.filterHashset.add(item.getItem()); + System.out.printf("Updated NBT filtering items: %s\n", this.nbtCheckingFilterItems); } - + + private void updateNbtCheckingCount(ItemVariant itemVariant, int change) { + if(!itemVariant.hasNbt()) { return; } + ItemStack stack = itemVariant.toStack(); + if((stack.isIn(SpectrumItemTags.TAG_FILTERING_ITEMS) && stack.hasCustomName()) || LoreHelper.hasLore(stack)) { + this.nbtCheckingFilterItems += change; + } + } + public Predicate getTransferFilterTo(PastelNodeBlockEntity other) { if (this.getNodeType().usesFilters() && !this.hasEmptyFilter()) { if (other.getNodeType().usesFilters() && !other.hasEmptyFilter()) { @@ -467,8 +489,13 @@ public Predicate getTransferFilterTo(PastelNodeBlockEntity other) { return itemVariant -> true; } } - private boolean filter(ItemVariant variant) { + if(nbtCheckingFilterItems == 0) { + System.out.printf("Using optimised filter for %s\n", variant); + return filterHashset.contains(variant.getItem()); + } + + System.out.printf("Using unoptimised filter for %s\n", variant); filter: for (ItemVariant filterItem : filterItems) { if (filterItem.isBlank()) { continue; From 45a1f208466462632f3ce057a108b1b618bc6c3e Mon Sep 17 00:00:00 2001 From: Aquaholic Date: Tue, 16 Dec 2025 14:50:45 +0800 Subject: [PATCH 2/4] Fix NBT damage filtering, potentially other NBT filtering as well. --- .../pastel_network/nodes/PastelNodeBlockEntity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index 24f1d24ebd..4fdf1f037d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -554,15 +554,15 @@ private boolean filter(ItemVariant variant) { public boolean testNBTPredicates(String description, ItemStack stack, ItemVariant variant) { var tested = variant.getNbt(); - var cleanString = StringUtils.trim(description).toLowerCase(); + var cleanString = StringUtils.trim(description); var pieces = StringUtils.splitByWholeSeparator(cleanString, null); var target = pieces[0]; - var predicateString = StringUtils.remove(cleanString, target); // We don't want ambiguity when checking for keywords + var predicateString = StringUtils.remove(cleanString.toLowerCase(), target); // We don't want ambiguity when checking for keywords var source = stack.getNbt(); //No need to check if it has nbt, to get here it already had to have some. boolean nullSourceFilter = false; // A few corrections for ease of use - if (StringUtils.equalsAnyIgnoreCase(target, "durability", "uses")) + if (StringUtils.equalsAnyIgnoreCase(target, "durability", "uses", "damage")) target = ItemStack.DAMAGE_KEY; if (StringUtils.equalsAnyIgnoreCase(target, "enchs", "enchants", "enchantment")) { @@ -639,7 +639,7 @@ public boolean testNBTPredicates(String description, ItemStack stack, ItemVarian } switch (testedData.getType()) { - case NbtElement.NUMBER_TYPE: { + case NbtElement.NUMBER_TYPE: case NbtElement.INT_TYPE: { var testedNum = ((AbstractNbtNumber) testedData).doubleValue(); // Special damage keywords - durability is weird and counts up as it decreases From 777434944ab901f8fc582f727559b7f63ec69493 Mon Sep 17 00:00:00 2001 From: Aquaholic Date: Tue, 16 Dec 2025 14:51:48 +0800 Subject: [PATCH 3/4] Remove debug prints. --- .../blocks/pastel_network/nodes/PastelNodeBlockEntity.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index 4fdf1f037d..b18f76d04c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -458,13 +458,11 @@ public List getItemFilters() { @Override public void setFilterItem(int slot, ItemVariant item) { - System.out.printf("Current NBT filtering items: %s\n", this.nbtCheckingFilterItems); updateNbtCheckingCount(item, 1); updateNbtCheckingCount(this.filterItems.get(slot), -1); if(Collections.frequency(this.filterItems, item) == 1) { this.filterHashset.remove(this.filterItems.get(slot).getItem()); } this.filterItems.set(slot, item); this.filterHashset.add(item.getItem()); - System.out.printf("Updated NBT filtering items: %s\n", this.nbtCheckingFilterItems); } private void updateNbtCheckingCount(ItemVariant itemVariant, int change) { @@ -491,11 +489,9 @@ public Predicate getTransferFilterTo(PastelNodeBlockEntity other) { } private boolean filter(ItemVariant variant) { if(nbtCheckingFilterItems == 0) { - System.out.printf("Using optimised filter for %s\n", variant); return filterHashset.contains(variant.getItem()); } - System.out.printf("Using unoptimised filter for %s\n", variant); filter: for (ItemVariant filterItem : filterItems) { if (filterItem.isBlank()) { continue; From 910897f1174741a503fdeebe1798cb5599d31114 Mon Sep 17 00:00:00 2001 From: Aquaholic Date: Tue, 16 Dec 2025 15:10:11 +0800 Subject: [PATCH 4/4] Additional Network error state fix Fix for creating networks with nodes A, B, C, with network inheriting node A's UUID, disconnecting node A (retaining network UUID), and connecting node A to node D, leading to node A and D being connected to network with A's UUID despite no connections, leading to an incorrect network state. This means recreating a network with the same nodes may have a different colour. --- .../pastel_network/network/ServerPastelNetworkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java index 54aab98944..b2fed4caae 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java @@ -106,7 +106,7 @@ public boolean toggleNodeConnection(PastelNodeBlockEntity firstNode, PastelNodeB // we have no network yet // => Create one if (firstNetwork.isEmpty() && secondNetwork.isEmpty()) { - ServerPastelNetwork newNetwork = createNetwork((ServerWorld) firstNode.getWorld(), firstNode.getNodeId()); + ServerPastelNetwork newNetwork = createNetwork((ServerWorld) firstNode.getWorld(), UUID.randomUUID()); newNetwork.addNode(secondNode); secondNode.setNetworkUUID(newNetwork.getUUID()); newNetwork.addNodeAndConnect(firstNode, secondNode);