From e2c5f8f7f1f18462bfcc6b1c458c8a63ce8c0345 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:13:06 -0500 Subject: [PATCH 1/7] Initial support for RE2/J regex --- build.gradle | 11 +++-- .../content/logistics/box/PackageItem.java | 12 ++--- .../display/GlobalTrainDisplayData.java | 8 ++-- .../trains/schedule/ScheduleScreen.java | 7 +-- .../destination/DestinationInstruction.java | 12 +++-- .../destination/FetchPackagesInstruction.java | 20 ++++---- .../foundation/utility/LogisticParser.java | 46 +++++++++++++++++++ .../infrastructure/config/CLogistics.java | 2 + 8 files changed, 88 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java diff --git a/build.gradle b/build.gradle index a6d5501e23..1ff499c3f7 100644 --- a/build.gradle +++ b/build.gradle @@ -132,9 +132,13 @@ repositories { includeGroup "mysticdrew" } } + maven { url = "https://oss.sonatype.org" } // RE2J } dependencies { + jarJar(implementation("com.google.re2j:re2j:1.8")) + additionalRuntimeClasspath "com.google.re2j:re2j:1.8" + jarJar(implementation("com.tterrag.registrate:Registrate:${registrate_version}")) jarJar("net.createmod.ponder:Ponder-NeoForge-${minecraft_version}:${ponder_version}") @@ -171,9 +175,10 @@ dependencies { } runtimeOnly("dev.architectury:architectury-neoforge:13.0.8") - implementation("dev.ftb.mods:ftb-chunks-neoforge:2101.1.1") - implementation("dev.ftb.mods:ftb-teams-neoforge:2101.1.0") - implementation("dev.ftb.mods:ftb-library-neoforge:2101.1.3") + // Commented out because these Maven pages don't appear to exist, and are only extra compat (not important) +// implementation("dev.ftb.mods:ftb-chunks-neoforge:2101.1.1") +// implementation("dev.ftb.mods:ftb-teams-neoforge:2101.1.0") +// implementation("dev.ftb.mods:ftb-library-neoforge:2101.1.3") implementation("maven.modrinth:journeymap:1.21.1-6.0.0-beta.32+neoforge") implementation("info.journeymap:journeymap-api-neoforge:2.0.0-1.21.1-SNAPSHOT") { diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index a773e61a7a..5e33b6fca0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; +import com.google.re2j.Pattern; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.simibubi.create.AllDataComponents; @@ -16,8 +17,9 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrderWithCrafts; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.utility.LogisticParser; + import net.createmod.catnip.codecs.stream.CatnipStreamCodecBuilders; -import net.createmod.catnip.data.Glob; import net.createmod.catnip.math.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -146,11 +148,9 @@ public static boolean matchAddress(ItemStack box, String address) { public static boolean matchAddress(String boxAddress, String address) { if (address.isBlank()) return boxAddress.isBlank(); - if (address.equals("*") || boxAddress.equals("*")) - return true; - String matcher = Glob.toRegexPattern(address, ""); - String boxMatcher = Glob.toRegexPattern(boxAddress, ""); - return address.matches(boxMatcher) || boxAddress.matches(matcher); + Pattern matcher = LogisticParser.dynamicToRegex(address, ""); + Pattern boxMatcher = LogisticParser.dynamicToRegex(boxAddress, ""); + return LogisticParser.anyMatches(boxMatcher, address) || LogisticParser.anyMatches(matcher, boxAddress); } public static String getAddress(ItemStack box) { diff --git a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java index baa05e1375..1042dbfeff 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java +++ b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java @@ -6,10 +6,11 @@ import java.util.List; import java.util.Map; +import com.google.re2j.Pattern; import com.simibubi.create.Create; import com.simibubi.create.content.trains.entity.Train; -import net.createmod.catnip.data.Glob; +import com.simibubi.create.foundation.utility.LogisticParser; import net.minecraft.network.chat.MutableComponent; @@ -32,11 +33,10 @@ public static void refresh() { } public static List prepare(String filter, int maxLines) { - String regex = Glob.toRegexPattern(filter, ""); + Pattern regex = LogisticParser.dynamicToRegex(filter, ""); return statusByDestination.entrySet() .stream() - .filter(e -> e.getKey() - .matches(regex)) + .filter(e -> LogisticParser.anyMatches(regex, e.getKey())) .flatMap(e -> e.getValue() .stream()) .sorted() diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index d7aede323b..e4a9893d6c 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import com.google.common.collect.ImmutableList; +import com.google.re2j.Pattern; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllDataComponents; @@ -322,14 +323,14 @@ private List> getViableStations(IScheduleInput field) { continue; if (destination == field) continue; - String filter = destination.getFilterForRegex(); - if (filter.isBlank()) + Pattern filter = destination.getFilterForRegex(); + if (filter.pattern().isBlank()) continue; Graphs: for (Iterator iterator = viableGraphs.iterator(); iterator.hasNext(); ) { TrackGraph trackGraph = iterator.next(); for (GlobalStation station : trackGraph.getPoints(EdgePointType.STATION)) { - if (station.name.matches(filter)) + if (filter.matches(station.name)) continue Graphs; } iterator.remove(); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java index f38b5d5baf..8c8392d81f 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java @@ -5,6 +5,9 @@ import javax.annotation.Nullable; +import com.google.re2j.Pattern; +import com.simibubi.create.foundation.utility.LogisticParser; + import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -17,7 +20,6 @@ import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.data.Glob; import net.createmod.catnip.data.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; @@ -54,8 +56,8 @@ public String getFilter() { return getLabelText(); } - public String getFilterForRegex() { - return Glob.toRegexPattern(getFilter(), ""); + public Pattern getFilterForRegex() { + return LogisticParser.dynamicToRegex(getFilter(), ""); } @Override @@ -78,7 +80,7 @@ protected void modifyEditBox(EditBox box) { @Override @Nullable public DiscoveredPath start(ScheduleRuntime runtime, Level level) { - String regex = getFilterForRegex(); + Pattern regex = getFilterForRegex(); boolean anyMatch = false; ArrayList validStations = new ArrayList<>(); Train train = runtime.train; @@ -91,7 +93,7 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { - if (!globalStation.name.matches(regex)) + if (!LogisticParser.anyMatches(regex, globalStation.name)) continue; anyMatch = true; validStations.add(globalStation); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java index 005488a3c0..78abdef1c1 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java @@ -5,6 +5,10 @@ import java.util.Map.Entry; import java.util.regex.PatternSyntaxException; +import com.google.re2j.Pattern; + +import com.simibubi.create.foundation.utility.LogisticParser; + import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -21,7 +25,6 @@ import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.data.Glob; import net.createmod.catnip.data.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; @@ -64,10 +67,10 @@ public String getFilter() { return getLabelText(); } - public String getFilterForRegex() { + public Pattern getFilterForRegex() { if (getFilter().isBlank()) - return Glob.toRegexPattern("*", ""); - return Glob.toRegexPattern(getFilter(), ""); + return LogisticParser.globToRegex("*", ""); + return LogisticParser.dynamicToRegex(getFilter(), ""); } @Override @@ -102,8 +105,8 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { MinecraftServer server = level.getServer(); if (server == null) return null; - - String regex = getFilterForRegex(); + + Pattern regex = getFilterForRegex(); boolean anyMatch = false; ArrayList validStations = new ArrayList<>(); Train train = runtime.train; @@ -118,7 +121,7 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { ServerLevel dimLevel = server.getLevel(globalStation.blockEntityDimension); if (dimLevel == null) continue; - + for (Entry entry : globalStation.connectedPorts.entrySet()) { GlobalPackagePort port = entry.getValue(); BlockPos pos = entry.getKey(); @@ -134,8 +137,7 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { if (PackageItem.matchAddress(stack, port.address)) continue; try { - if (!PackageItem.getAddress(stack) - .matches(regex)) + if (!regex.matches(PackageItem.getAddress(stack))) continue; anyMatch = true; validStations.add(globalStation); diff --git a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java new file mode 100644 index 0000000000..a82cb30296 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java @@ -0,0 +1,46 @@ +package com.simibubi.create.foundation.utility; + +import com.google.re2j.Pattern; +import com.simibubi.create.infrastructure.config.AllConfigs; + +import net.createmod.catnip.data.Glob; + +import java.util.regex.PatternSyntaxException; + +public class LogisticParser { + // Dynamic regex creation: + // - If raw regex is enabled, uses a SAFE RE2/J parser + // - Otherwise, uses the current glob parser + public static Pattern dynamicToRegex(String pattern, String defaultPatternIfError) { + boolean usingRawRegex = AllConfigs.server().logistics.useRegexForLogistics.get(); + if (usingRawRegex) { + return toRegex(pattern, defaultPatternIfError); + } + return globToRegex(pattern, defaultPatternIfError); + } + + // Basic regex creation: + // - Uses a SAFE RE2/J parser + public static Pattern toRegex(String pattern, String defaultPatternIfError) { + try { + return Pattern.compile(pattern); + } catch (PatternSyntaxException e) { + return Pattern.compile(defaultPatternIfError); + } + } + + // Glob regex creation: + // - Uses the current glob parser + public static Pattern globToRegex(String pattern, String defaultGlobIfError) { + boolean usingRawRegex = AllConfigs.server().logistics.useRegexForLogistics.get(); + try { + return Pattern.compile(Glob.toRegexPattern(pattern)); + } catch (PatternSyntaxException e) { + return Pattern.compile(Glob.toRegexPattern(defaultGlobIfError)); + } + } + + public static boolean anyMatches(Pattern pattern, String match) { + return pattern.matcher(match).find(); + } +} diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index 726f5c7c1b..e32fb0165a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -8,6 +8,7 @@ public class CLogistics extends ConfigBase { public final ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); public final ConfigInt psiTimeout = i(60, 1, "psiTimeout", Comments.psiTimeout); public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); + public final ConfigBool useRegexForLogistics = b(false, "useRegexForLogistics", Comments.useRegexForLogistics); public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); @@ -31,6 +32,7 @@ private static class Comments { static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; + static String useRegexForLogistics = "Whether to enable regex-based pattern matching in Frogports, Package Filters, etc."; static String packagePortRange = "Maximum distance in blocks a Package Port can be placed at from its target."; static String vaultCapacity = "The total amount of stacks a vault can hold per block in size."; static String chainConveyorCapacity = "The amount of packages a chain conveyor can carry at a time."; From 0fab81e36cf143effc648c6db97dbae82c5ff924 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:14:33 -0500 Subject: [PATCH 2/7] Initial support for RE2/J regex --- .../com/simibubi/create/foundation/utility/LogisticParser.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java index a82cb30296..1a65470c77 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java +++ b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java @@ -32,7 +32,6 @@ public static Pattern toRegex(String pattern, String defaultPatternIfError) { // Glob regex creation: // - Uses the current glob parser public static Pattern globToRegex(String pattern, String defaultGlobIfError) { - boolean usingRawRegex = AllConfigs.server().logistics.useRegexForLogistics.get(); try { return Pattern.compile(Glob.toRegexPattern(pattern)); } catch (PatternSyntaxException e) { From f8070a5626947c67f11bd6fe154c64d038a529e8 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Wed, 9 Apr 2025 10:36:13 -0500 Subject: [PATCH 3/7] Add tooltip info when Regex mode is enabled (needs translation) --- .../resources/assets/create/lang/en_us.json | 4 +- .../packagePort/PackagePortScreen.java | 37 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 94c9e8facd..47f22418dc 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1270,6 +1270,8 @@ "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", + "create.gui.package_port.catch_packages_regex": "Regex: Escape special characters with \\", + "create.gui.package_port.catch_packages_wildcard_regex": "Use .* as a text wildcard", "create.gui.package_port.not_targeting_anything": "No target selected", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", @@ -3365,4 +3367,4 @@ "item.create.zinc_nugget": "Zinc Nugget", "itemGroup.create.base": "Create", "itemGroup.create.palettes": "Create's Building Blocks" -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index eaa769c403..040e898119 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.List; import java.util.function.Consumer; +import java.util.stream.Stream; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.InputConstants; @@ -14,6 +15,8 @@ import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.config.AllConfigs; + import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.createmod.catnip.platform.CatnipServices; @@ -25,6 +28,10 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; + public class PackagePortScreen extends AbstractSimiContainerScreen { private boolean frogMode; @@ -149,16 +156,32 @@ protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, i graphics.renderItem(menu.contentHolder.target.getIcon(), x + 1, y + 1); if (addressBox.isHovered()) { - graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.catch_packages") - .color(AbstractSimiWidget.HEADER_RGB) - .component(), + List<@NotNull Component> staticTooltip = List.of(CreateLang.translate("gui.package_port.catch_packages") + .color(AbstractSimiWidget.HEADER_RGB) + .component(), CreateLang.translate("gui.package_port.catch_packages_empty") .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.package_port.catch_packages_wildcard") + .component()); + List<@NotNull Component> dynamicTooltip; + + if (AllConfigs.server().logistics.useRegexForLogistics.get()) { + dynamicTooltip = List.of( + CreateLang.translate("gui.package_port.catch_packages_wildcard_regex") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.package_port.catch_packages_regex") + .style(ChatFormatting.GOLD) + .component()); + } else { + dynamicTooltip = List.of( + CreateLang.translate("gui.package_port.catch_packages_wildcard") .style(ChatFormatting.GRAY) - .component()), - pMouseX, pMouseY); + .component()); + } + + List<@NotNull Component> fullTooltip = Stream.concat(staticTooltip.stream(), dynamicTooltip.stream()).toList(); + + graphics.renderComponentTooltip(font, fullTooltip, pMouseX, pMouseY); } } From 047eabe081020b92627481c243f69db065a585d2 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Thu, 10 Apr 2025 20:09:51 -0500 Subject: [PATCH 4/7] feat: Add per-block regex support for any pattern-matching blocks (unfinished: ChainConveyorBlockEntity updates); feat: Add tooltip data (unfinished: train station and schedule tooltips) --- .../resources/assets/create/lang/en_us.json | 9 +++ .../simibubi/create/AllDataComponents.java | 5 ++ .../ChainConveyorBlockEntity.java | 41 +++++++++++--- .../ChainConveyorRoutingTable.java | 12 ++-- .../content/logistics/box/PackageItem.java | 15 +++-- .../logistics/filter/FilterItemStack.java | 4 +- .../logistics/filter/FilterScreenPacket.java | 4 +- .../logistics/filter/PackageFilterMenu.java | 11 +++- .../logistics/filter/PackageFilterScreen.java | 42 ++++++++++++++ ...PackagePortAutomationInventoryWrapper.java | 6 +- .../packagePort/PackagePortBlockEntity.java | 11 ++++ .../PackagePortConfigurationPacket.java | 10 +++- .../packagePort/PackagePortScreen.java | 52 ++++++++++++++++-- .../packagePort/PackagePortTarget.java | 4 +- .../frogport/FrogportBlockEntity.java | 3 +- .../display/GlobalTrainDisplayData.java | 2 +- .../trains/schedule/ScheduleScreen.java | 2 +- .../DeliverPackagesInstruction.java | 2 +- .../destination/DestinationInstruction.java | 37 ++++++++++++- .../destination/FetchPackagesInstruction.java | 43 +++++++++++++-- .../destination/ScheduleInstruction.java | 1 + .../destination/TextScheduleInstruction.java | 1 - .../content/trains/station/GlobalStation.java | 7 ++- .../trains/station/StationBlockEntity.java | 2 +- .../create/foundation/gui/AllIcons.java | 3 +- .../create/foundation/utility/CreateLang.java | 7 +++ .../foundation/utility/LogisticParser.java | 15 +++-- .../infrastructure/config/CLogistics.java | 4 +- .../assets/create/textures/gui/icons.png | Bin 4107 -> 5207 bytes 29 files changed, 296 insertions(+), 59 deletions(-) diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 47f22418dc..e49febbf25 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1259,6 +1259,9 @@ "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", "create.gui.filter.respect_data": "Respect Data", "create.gui.filter.respect_data.description": "Items only match if their durability, enchantments, and other attributes match as well.", + "create.gui.package_filter.use_glob_patterns": "Use glob patterns for address pattern matching", + "create.gui.package_filter.use_regex": "Use regex for address pattern matching", + "create.gui.package_filter.use_regex_advanced": "(ADVANCED)", "create.gui.gauge.info_header": "Gauge Information:", "create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.basin_contents": "Basin Contents:", @@ -1275,6 +1278,9 @@ "create.gui.package_port.not_targeting_anything": "No target selected", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", + "create.gui.package_port.use_glob_patterns": "Use glob patterns for address pattern matching", + "create.gui.package_port.use_regex": "(ADVANCED) Use regex for address pattern matching", + "create.gui.package_port.use_regex_disabled": "Enable regex in gameplay settings", "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", "create.gui.redstone_requester.requester_address": "Send order to...", @@ -1290,6 +1296,9 @@ "create.gui.schedule.move_up": "Move up", "create.gui.schedule.remove_entry": "Remove Action", "create.gui.schedule.rmb_remove": "Right-Click to Remove", + "create.gui.schedule.fetch_packages.use_glob": "Glob", + "create.gui.schedule.fetch_packages.use_regex": "Regex", + "create.gui.schedule.fetch_packages.address_matching": "Match Address by...", "create.gui.schematicTable.availableSchematics": "Available Schematics", "create.gui.schematicTable.finished": "Upload Finished!", "create.gui.schematicTable.noSchematics": "No Schematics Saved", diff --git a/src/main/java/com/simibubi/create/AllDataComponents.java b/src/main/java/com/simibubi/create/AllDataComponents.java index a1d766343b..f65bc634d6 100644 --- a/src/main/java/com/simibubi/create/AllDataComponents.java +++ b/src/main/java/com/simibubi/create/AllDataComponents.java @@ -314,6 +314,11 @@ public class AllDataComponents { builder -> builder.persistent(Codec.STRING).networkSynchronized(ByteBufCodecs.STRING_UTF8) ); + public static final DataComponentType FILTER_BY_REGEX = register( + "filter_by_regex", + builder -> builder.persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL) + ); + public static final DataComponentType PACKAGE_CONTENTS = register( "package_contents", builder -> builder.persistent(ItemContainerContents.CODEC).networkSynchronized(ItemContainerContents.STREAM_CODEC) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index bcb3580c55..a5e95d4a5d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -21,6 +21,7 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.ChainConveyorOBB; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.ServerSpeedProvider; @@ -57,12 +58,14 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import org.checkerframework.checker.units.qual.C; + public class ChainConveyorBlockEntity extends KineticBlockEntity implements TransformableBlockEntity { public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { } - public record ConnectedPort(float chainPosition, @Nullable BlockPos connection, String filter) { + public record ConnectedPort(float chainPosition, @Nullable BlockPos connection, String filter, boolean usesRegex) { } public Set connections = new HashSet<>(); @@ -86,6 +89,30 @@ public ChainConveyorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockSt checkInvalid = true; } + private void updatePortRegexSettings() { + updatePortsRegexSettings(travelPorts); + updatePortsRegexSettings(loopPorts); + notifyUpdate(); + } + + private void updatePortsRegexSettings(Map ports) { + for (Entry entry : ports.entrySet()) { + BlockPos targetPos = entry.getKey(); + ConnectedPort port = entry.getValue(); + if (port.usesRegex()) continue; + + BlockEntity be = level.getBlockEntity(worldPosition.offset(targetPos)); + boolean newState = be instanceof PackagePortBlockEntity ppbe && ppbe.usingRegex(); + + if (newState != port.usesRegex) { + ports.put(targetPos, new ConnectedPort(port.chainPosition(), + port.connection(), + port.filter(), + newState)); + } + } + } + @Override protected AABB createRenderBoundingBox() { return new AABB(worldPosition).inflate(connections.isEmpty() ? 3 : 64); @@ -206,9 +233,9 @@ public void tick() { box.chainPosition += serverSpeed * distancePerTick; box.chainPosition = Math.min(stats.chainLength, box.chainPosition); - float anticipatePosition = box.chainPosition; - anticipatePosition += serverSpeed * distancePerTick * 4; - anticipatePosition = Math.min(stats.chainLength, anticipatePosition); + float anticipatedPosition = box.chainPosition; + anticipatedPosition += serverSpeed * distancePerTick * 4; + anticipatedPosition = Math.min(stats.chainLength, anticipatedPosition); if (level.isClientSide() && !isVirtual()) continue; @@ -223,9 +250,9 @@ public void tick() { continue; boolean notAtPositionYet = box.chainPosition < chainPosition; - if (notAtPositionYet && anticipatePosition < chainPosition) + if (notAtPositionYet && anticipatedPosition < chainPosition) continue; - if (!PackageItem.matchAddress(box.item, port.filter())) + if (!PackageItem.matchAddress(box.item, port.filter(), port.usesRegex())) continue; if (notAtPositionYet) { notifyPortToAnticipate(portEntry.getKey()); @@ -276,7 +303,7 @@ public void tick() { boolean notAtPositionYet = !loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle); if (notAtPositionYet && !loopThresholdCrossed(anticipatePosition, prevChainPosition, offBranchAngle)) continue; - if (!PackageItem.matchAddress(box.item, port.filter())) + if (!PackageItem.matchAddress(box.item, port.filter(), port.usesRegex())) continue; if (notAtPositionYet) { notifyPortToAnticipate(portEntry.getKey()); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java index fb8ac8f5aa..915899c2c7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java @@ -4,6 +4,8 @@ import java.util.Collection; import java.util.List; +import com.simibubi.create.foundation.utility.LogisticParser; + import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.content.logistics.box.PackageItem; @@ -17,7 +19,7 @@ public class ChainConveyorRoutingTable { public static final int ENTRY_TIMEOUT = 100; public static final int PORT_ENTRY_TIMEOUT = 20; - public record RoutingTableEntry(String port, int distance, BlockPos nextConnection, MutableInt timeout, + public record RoutingTableEntry(String port, boolean useRegex, int distance, BlockPos nextConnection, MutableInt timeout, boolean endOfRoute) { public void tick() { @@ -29,7 +31,7 @@ public boolean invalid() { } public RoutingTableEntry copyForNeighbour(BlockPos connection) { - return new RoutingTableEntry(port, distance + 1, connection.multiply(-1), new MutableInt(ENTRY_TIMEOUT), + return new RoutingTableEntry(port, useRegex, distance + 1, connection.multiply(-1), new MutableInt(ENTRY_TIMEOUT), false); } @@ -49,13 +51,13 @@ public boolean shouldAdvertise() { return changed || lastUpdate > ENTRY_TIMEOUT - 20; } - public void receivePortInfo(String filter, BlockPos connection) { - insert(new RoutingTableEntry(filter, "*".equals(filter) ? 1000 : 0, connection, new MutableInt(PORT_ENTRY_TIMEOUT), true)); + public void receivePortInfo(String filter, boolean usesRegex, BlockPos connection) { + insert(new RoutingTableEntry(filter, usesRegex, LogisticParser.matchesAll(filter, usesRegex) ? 1000 : 0, connection, new MutableInt(PORT_ENTRY_TIMEOUT), true)); } public BlockPos getExitFor(ItemStack box) { for (RoutingTableEntry entry : entriesByDistance) - if (PackageItem.matchAddress(box, entry.port())) + if (PackageItem.matchAddress(box, entry.port(), entry.useRegex())) return entry.nextConnection(); return BlockPos.ZERO; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 5e33b6fca0..36e6575d5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -141,18 +141,21 @@ public static void addOrderContext(ItemStack box, PackageOrderWithCrafts orderCo box.set(AllDataComponents.PACKAGE_ORDER_CONTEXT, orderContext); } - public static boolean matchAddress(ItemStack box, String address) { - return matchAddress(getAddress(box), address); + public static boolean matchAddress(ItemStack box, String address, boolean useRegex) { + return matchAddress(getAddress(box), address, useRegex); } - public static boolean matchAddress(String boxAddress, String address) { + public static boolean matchAddress(String boxAddress, String address, boolean useRegex) { if (address.isBlank()) return boxAddress.isBlank(); - Pattern matcher = LogisticParser.dynamicToRegex(address, ""); - Pattern boxMatcher = LogisticParser.dynamicToRegex(boxAddress, ""); - return LogisticParser.anyMatches(boxMatcher, address) || LogisticParser.anyMatches(matcher, boxAddress); + Pattern addressMatcher = LogisticParser.dynamicToRegex(address, "", useRegex); + Pattern boxAddressMatcher = LogisticParser.dynamicToRegex(boxAddress, "", useRegex); + + return LogisticParser.anyMatches(addressMatcher, boxAddress) || LogisticParser.anyMatches(boxAddressMatcher, address); } + // public static boolean + public static String getAddress(ItemStack box) { return box.getOrDefault(AllDataComponents.PACKAGE_ADDRESS, ""); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index 599befa1ab..4a338aa838 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -239,16 +239,18 @@ public boolean test(Level world, ItemStack stack, boolean matchNBT) { public static class PackageFilterItemStack extends FilterItemStack { public String filterString; + public boolean useRegex; protected PackageFilterItemStack(ItemStack filter) { super(filter); filterString = PackageItem.getAddress(filter); + useRegex = filter.getOrDefault(AllDataComponents.FILTER_BY_REGEX, false); } @Override public boolean test(Level world, ItemStack stack, boolean matchNBT) { return (filterString.isBlank() && super.test(world, stack, matchNBT)) - || PackageItem.isPackage(stack) && PackageItem.matchAddress(stack, filterString); + || PackageItem.isPackage(stack) && PackageItem.matchAddress(stack, filterString, useRegex); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java index a50dd5fd9b..43a39f42ca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java @@ -66,11 +66,13 @@ public void handle(ServerPlayer player) { if (player.containerMenu instanceof PackageFilterMenu c) { if (option == Option.UPDATE_ADDRESS) c.address = tag.getString("Address"); + if (option == Option.UPDATE_MATCH_TYPE) + c.useRegex = tag.getBoolean("UseRegex"); } } public enum Option { - WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG, UPDATE_ADDRESS; + WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG, UPDATE_ADDRESS, UPDATE_MATCH_TYPE; public static final StreamCodec STREAM_CODEC = CatnipStreamCodecBuilders.ofEnum(Option.class); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java index 25a1237794..18bbdbff56 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java @@ -3,6 +3,8 @@ import com.simibubi.create.AllDataComponents; import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.infrastructure.config.AllConfigs; + import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; @@ -14,6 +16,7 @@ public class PackageFilterMenu extends AbstractFilterMenu { String address; + boolean useRegex; EditBox addressInput; public PackageFilterMenu(MenuType type, int id, Inventory inv, RegistryFriendlyByteBuf extraData) { @@ -55,17 +58,23 @@ public void clearContents() { protected void initAndReadInventory(ItemStack filterItem) { super.initAndReadInventory(filterItem); address = filterItem.getOrDefault(AllDataComponents.PACKAGE_ADDRESS, ""); + useRegex = filterItem.getOrDefault(AllDataComponents.FILTER_BY_REGEX, false); + } + + public boolean usingRegex() { + return AllConfigs.server().logistics.enableAdvancedRegex.get() && useRegex; } @Override protected void saveData(ItemStack filterItem) { super.saveData(filterItem); + filterItem.set(AllDataComponents.FILTER_BY_REGEX, useRegex); if (address.isBlank()) filterItem.remove(AllDataComponents.PACKAGE_ADDRESS); else filterItem.set(AllDataComponents.PACKAGE_ADDRESS, address); } - + @Override public ItemStack quickMoveStack(Player playerIn, int index) { return ItemStack.EMPTY; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index d53b130564..4657b5ca0b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -1,5 +1,11 @@ package com.simibubi.create.content.logistics.filter; +import com.simibubi.create.foundation.gui.AllIcons; + +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; + import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; @@ -16,9 +22,12 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; +import java.util.concurrent.atomic.AtomicBoolean; + public class PackageFilterScreen extends AbstractFilterScreen { private AddressEditBox addressBox; + private IconButton useGlobPatternButton, useRegexButton; private boolean deferFocus; public PackageFilterScreen(PackageFilterMenu menu, Inventory inv, Component title) { @@ -37,6 +46,7 @@ protected void containerTick() { @Override protected void init() { + AtomicBoolean regexState = new AtomicBoolean(menu.useRegex); setWindowOffset(-11, 7); super.init(); @@ -49,6 +59,31 @@ protected void init() { addressBox.setResponder(this::onAddressEdited); addRenderableWidget(addressBox); + useGlobPatternButton = new IconButton(x + 18, y + 28 + 36, AllIcons.I_GLOB_PATTERN); + useGlobPatternButton.withCallback(() -> { + useGlobPatternButton.green = true; + useRegexButton.green = false; + regexState.set(false); + onRegexToggled(regexState); + }); + useGlobPatternButton.setToolTip(CreateLang.translate("gui.package_filter.use_glob_patterns") + .style(ChatFormatting.WHITE) + .component()); + addRenderableWidget(useGlobPatternButton); + + useRegexButton = new IconButton(x + 18 + 18, y + 28 + 36, AllIcons.I_REGEX); + useRegexButton.active = menu.usingRegex(); + useRegexButton.withCallback(() -> { + useGlobPatternButton.green = false; + useRegexButton.green = true; + regexState.set(true); + onRegexToggled(regexState); + }); + useRegexButton.setToolTip(CreateLang.translate("gui.package_filter.use_regex") + .style(ChatFormatting.GOLD) + .component()); + addRenderableWidget(useRegexButton); + setFocused(addressBox); } @@ -71,6 +106,13 @@ public void onAddressEdited(String s) { CatnipServices.NETWORK.sendToServer(new FilterScreenPacket(Option.UPDATE_ADDRESS, tag)); } + public void onRegexToggled(AtomicBoolean b) { + menu.useRegex = b.get(); + CompoundTag tag = new CompoundTag(); + tag.putBoolean("UseRegex", b.get()); + CatnipServices.NETWORK.sendToServer(new FilterScreenPacket(Option.UPDATE_MATCH_TYPE, tag)); + } + @Override public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { return super.mouseClicked(pMouseX, pMouseY, pButton); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java index 304863bc2e..a1220f4933 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java @@ -29,7 +29,8 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { if (!PackageItem.isPackage(stack)) return false; String filterString = ppbe.getFilterString(); - return filterString != null && PackageItem.matchAddress(stack, filterString); + boolean usesRegex = ppbe.usingRegex(); + return filterString != null && PackageItem.matchAddress(stack, filterString, usesRegex); }, simulate); access = false; @@ -41,7 +42,8 @@ public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { if (!PackageItem.isPackage(stack)) return stack; String filterString = ppbe.getFilterString(); - if (filterString != null && PackageItem.matchAddress(stack, filterString)) + boolean usesRegex = ppbe.usingRegex(); + if (filterString != null && PackageItem.matchAddress(stack, filterString, usesRegex)) return stack; return super.insertItem(slot, stack, simulate); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 556e0709ff..09f4c5f54b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -13,6 +13,8 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.config.AllConfigs; + import net.createmod.catnip.codecs.CatnipCodecUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -35,6 +37,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements MenuProvider { public boolean acceptsPackages; + public boolean usesRegex; public String addressFilter; public PackagePortTarget target; public SmartInventory inventory; @@ -46,6 +49,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); addressFilter = ""; + usesRegex = false; acceptsPackages = true; inventory = new SmartInventory(18, this); itemHandler = new PackagePortAutomationInventoryWrapper(inventory, this); @@ -61,6 +65,7 @@ public boolean isBackedUp() { public void filterChanged() { if (target != null) { + System.out.println("FilterChanged Event"); target.deregister(this, level, worldPosition); target.register(this, level, worldPosition); } @@ -77,6 +82,10 @@ public String getFilterString() { return acceptsPackages ? addressFilter : null; } + public boolean usingRegex() { + return usesRegex && AllConfigs.server().logistics.enableAdvancedRegex.get(); + } + @Override protected void write(CompoundTag tag, HolderLookup.Provider registries, boolean clientPacket) { super.write(tag, registries, clientPacket); @@ -84,6 +93,7 @@ protected void write(CompoundTag tag, HolderLookup.Provider registries, boolean tag.put("Target", CatnipCodecUtils.encode(PackagePortTarget.CODEC, target).orElseThrow()); tag.putString("AddressFilter", addressFilter); tag.putBoolean("AcceptsPackages", acceptsPackages); + tag.putBoolean("UsesRegex", usingRegex()); tag.put("Inventory", inventory.serializeNBT(registries)); } @@ -95,6 +105,7 @@ protected void read(CompoundTag tag, HolderLookup.Provider registries, boolean c target = CatnipCodecUtils.decode(PackagePortTarget.CODEC, tag.getCompound("Target")).orElse(null); addressFilter = tag.getString("AddressFilter"); acceptsPackages = tag.getBoolean("AcceptsPackages"); + usesRegex = tag.getBoolean("UsesRegex"); if (clientPacket && prevTarget != target) invalidateRenderBoundingBox(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java index 115bdf784f..285f57f850 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java @@ -3,6 +3,8 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; +import com.simibubi.create.infrastructure.config.AllConfigs; + import io.netty.buffer.ByteBuf; import net.minecraft.core.BlockPos; import net.minecraft.network.codec.ByteBufCodecs; @@ -14,16 +16,19 @@ public class PackagePortConfigurationPacket extends BlockEntityConfigurationPack BlockPos.STREAM_CODEC, packet -> packet.pos, ByteBufCodecs.STRING_UTF8, packet -> packet.newFilter, ByteBufCodecs.BOOL, packet -> packet.acceptPackages, + ByteBufCodecs.BOOL, packet -> packet.useRegex, PackagePortConfigurationPacket::new ); private final String newFilter; private final boolean acceptPackages; + private final boolean useRegex; - public PackagePortConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages) { + public PackagePortConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages, boolean useRegex) { super(pos); this.newFilter = newFilter; this.acceptPackages = acceptPackages; + this.useRegex = useRegex; } @Override @@ -33,10 +38,11 @@ public PacketTypeProvider getTypeProvider() { @Override protected void applySettings(ServerPlayer player, PackagePortBlockEntity be) { - if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages) + if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages && be.usesRegex == useRegex) return; be.addressFilter = newFilter; be.acceptsPackages = acceptPackages; + be.usesRegex = useRegex; be.filterChanged(); be.notifyUpdate(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index 040e898119..52c05598bc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -30,8 +30,6 @@ import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; - public class PackagePortScreen extends AbstractSimiContainerScreen { private boolean frogMode; @@ -41,6 +39,8 @@ public class PackagePortScreen extends AbstractSimiContainerScreen { + useGlobPatterns.green = true; + useRegex.green = false; + }); + useGlobPatterns.green = !menu.contentHolder.usesRegex; + useGlobPatterns.visible = menu.contentHolder.acceptsPackages; + useGlobPatterns.setToolTip( + CreateLang.translate("gui.package_port.use_glob_patterns") + .style(ChatFormatting.WHITE) + .component()); + addRenderableWidget(useGlobPatterns); + + useRegex = new IconButton(x + 37 + 18 + 22 + 18, y + background.getHeight() - 24, AllIcons.I_REGEX); + useRegex.withCallback(() -> { + useRegex.green = true; + useGlobPatterns.green = false; + }); + useRegex.green = menu.contentHolder.usesRegex; + + boolean regexEnabled = AllConfigs.server().logistics.enableAdvancedRegex.get(); + + useRegex.visible = menu.contentHolder.acceptsPackages; + useRegex.active = regexEnabled; + useRegex.setToolTip( + CreateLang.translate("gui.package_port.use_regex") + .style(ChatFormatting.WHITE) + .component()); + + addRenderableWidget(useRegex); + + containerTick(); extraAreas = ImmutableList.of(new Rect2i(x + background.getWidth(), y + background.getHeight() - 50, 70, 60)); @@ -114,6 +152,8 @@ private int nameBoxX(String s, EditBox nameBox) { protected void containerTick() { acceptPackages.visible = menu.contentHolder.target != null; dontAcceptPackages.visible = menu.contentHolder.target != null; + useRegex.visible = menu.contentHolder.target != null; + useGlobPatterns.visible = menu.contentHolder.target != null; super.containerTick(); } @@ -164,7 +204,7 @@ protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, i .component()); List<@NotNull Component> dynamicTooltip; - if (AllConfigs.server().logistics.useRegexForLogistics.get()) { + if (AllConfigs.server().logistics.enableAdvancedRegex.get()) { dynamicTooltip = List.of( CreateLang.translate("gui.package_port.catch_packages_wildcard_regex") .style(ChatFormatting.GRAY) @@ -201,7 +241,7 @@ public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { @Override public void removed() { CatnipServices.NETWORK.sendToServer(new PackagePortConfigurationPacket(menu.contentHolder.getBlockPos(), addressBox.getValue(), - acceptPackages.green)); + acceptPackages.green, useRegex.green)); super.removed(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index 6719620966..18023473a9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -153,9 +153,9 @@ public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos String portFilter = ppbe.getFilterString(); if (portFilter == null) return; - actualBe.routingTable.receivePortInfo(portFilter, connection == null ? BlockPos.ZERO : connection); + actualBe.routingTable.receivePortInfo(portFilter, ppbe.usesRegex, connection == null ? BlockPos.ZERO : connection); Map portMap = connection == null ? actualBe.loopPorts : actualBe.travelPorts; - portMap.put(relativePos.multiply(-1), new ConnectedPort(chainPos, connection, portFilter)); + portMap.put(relativePos.multiply(-1), new ConnectedPort(chainPos, connection, portFilter, ppbe.usingRegex())); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 04e9e011e7..02bd48b94f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -295,8 +295,9 @@ public boolean tryPullingFrom(IItemHandler handler) { if (!PackageItem.isPackage(stack)) return false; String filterString = getFilterString(); + boolean usesRegex = usingRegex(); return filterString == null || handler instanceof PackagerItemHandler - || !PackageItem.matchAddress(stack, filterString); + || !PackageItem.matchAddress(stack, filterString, usesRegex); }, false); if (extract.isEmpty()) return false; diff --git a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java index 1042dbfeff..b6a3caef6c 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java +++ b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java @@ -33,7 +33,7 @@ public static void refresh() { } public static List prepare(String filter, int maxLines) { - Pattern regex = LogisticParser.dynamicToRegex(filter, ""); + Pattern regex = LogisticParser.toRegex(filter, ""); return statusByDestination.entrySet() .stream() .filter(e -> LogisticParser.anyMatches(regex, e.getKey())) diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index e4a9893d6c..c33d7df013 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -323,7 +323,7 @@ private List> getViableStations(IScheduleInput field) { continue; if (destination == field) continue; - Pattern filter = destination.getFilterForRegex(); + Pattern filter = destination.getFilterRegex(); if (filter.pattern().isBlank()) continue; Graphs: diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java index 0fd404c276..526fa102a4 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java @@ -92,7 +92,7 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { firstPackage = PackageItem.getAddress(stack); for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { for (Entry port : globalStation.connectedPorts.entrySet()) { - if (!PackageItem.matchAddress(stack, port.getValue().address)) + if (!PackageItem.matchAddress(stack, port.getValue().address, port.getValue().usesRegex)) continue; anyMatch = true; validStations.add(globalStation); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java index 8c8392d81f..79bfb35aec 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java @@ -6,8 +6,11 @@ import javax.annotation.Nullable; import com.google.re2j.Pattern; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.LogisticParser; +import com.simibubi.create.infrastructure.config.AllConfigs; + import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -30,6 +33,8 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + public class DestinationInstruction extends TextScheduleInstruction { @Override @@ -52,12 +57,38 @@ public ItemStack getSecondLineIcon() { return AllBlocks.TRACK_STATION.asStack(); } + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(ModularGuiLineBuilder builder) { + List<@NotNull String> scrollInputOptions = AllConfigs.server().logistics.enableAdvancedRegex.get() + ? List.of("use_glob", "use_regex") + : List.of("use_glob"); + + builder.addTextInput(0, 103-18-9, (e, t) -> modifyEditBox(e), "Text") + .addSelectionScrollInput(103-22, + 40, + (si, l) -> si.forOptions(CreateLang + .translatedOptions("gui.schedule.fetch_packages", + scrollInputOptions)) + .titled(CreateLang + .translate("gui.schedule.fetch_packages.address_matching") + .component()), + "UseRegex"); + } + + public boolean useRegex() { + Create.LOGGER.info("Regex key was " + data.getInt("UseRegex")); + return data.getInt("UseRegex") == 1; + } + public String getFilter() { return getLabelText(); } - public Pattern getFilterForRegex() { - return LogisticParser.dynamicToRegex(getFilter(), ""); + public Pattern getFilterRegex() { + if (getFilter().isBlank()) + return Pattern.compile(".*"); + return LogisticParser.dynamicToRegex(getFilter(), "", useRegex()); } @Override @@ -80,7 +111,7 @@ protected void modifyEditBox(EditBox box) { @Override @Nullable public DiscoveredPath start(ScheduleRuntime runtime, Level level) { - Pattern regex = getFilterForRegex(); + Pattern regex = getFilterRegex(); boolean anyMatch = false; ArrayList validStations = new ArrayList<>(); Train train = runtime.train; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java index 78abdef1c1..ff88c1317c 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java @@ -7,8 +7,13 @@ import com.google.re2j.Pattern; +import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.LogisticParser; +import com.simibubi.create.infrastructure.config.AllConfigs; + +import net.createmod.catnip.data.Glob; + import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -40,6 +45,8 @@ import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.NotNull; + public class FetchPackagesInstruction extends TextScheduleInstruction { @Override @@ -63,14 +70,37 @@ public ItemStack getSecondLineIcon() { return PackageStyles.getDefaultBox(); } + @Override + @OnlyIn(Dist.CLIENT) + public void initConfigurationWidgets(ModularGuiLineBuilder builder) { + List<@NotNull String> scrollInputOptions = AllConfigs.server().logistics.enableAdvancedRegex.get() + ? List.of("use_glob", "use_regex") + : List.of("use_glob"); + + builder.addTextInput(0, 103-18-9, (e, t) -> modifyEditBox(e), "Text") + .addSelectionScrollInput(103-22, + 40, + (si, l) -> si.forOptions(CreateLang + .translatedOptions("gui.schedule.fetch_packages", + scrollInputOptions)) + .titled(CreateLang + .translate("gui.schedule.fetch_packages.address_matching") + .component()), + "UseRegex"); + } + + public boolean useRegex() { + return data.getString("UseRegex").contains("Regex"); + } + public String getFilter() { return getLabelText(); } - public Pattern getFilterForRegex() { + public Pattern getFilterRegex() { if (getFilter().isBlank()) - return LogisticParser.globToRegex("*", ""); - return LogisticParser.dynamicToRegex(getFilter(), ""); + return Pattern.compile(".*"); + return LogisticParser.dynamicToRegex(getFilter(), "", useRegex()); } @Override @@ -106,7 +136,6 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { if (server == null) return null; - Pattern regex = getFilterForRegex(); boolean anyMatch = false; ArrayList validStations = new ArrayList<>(); Train train = runtime.train; @@ -121,20 +150,22 @@ public DiscoveredPath start(ScheduleRuntime runtime, Level level) { ServerLevel dimLevel = server.getLevel(globalStation.blockEntityDimension); if (dimLevel == null) continue; + Pattern regex = getFilterRegex(); for (Entry entry : globalStation.connectedPorts.entrySet()) { GlobalPackagePort port = entry.getValue(); BlockPos pos = entry.getKey(); IItemHandlerModifiable postboxInventory = port.offlineBuffer; - if (dimLevel.isLoaded(pos) && dimLevel.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) + if (dimLevel.isLoaded(pos) && dimLevel.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { postboxInventory = ppbe.inventory; + } for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { ItemStack stack = postboxInventory.getStackInSlot(slot); if (!PackageItem.isPackage(stack)) continue; - if (PackageItem.matchAddress(stack, port.address)) + if (PackageItem.matchAddress(stack, port.address, port.usesRegex)) continue; try { if (!regex.matches(PackageItem.getAddress(stack))) diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java index 0ab7670759..8892d795d9 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java @@ -34,6 +34,7 @@ public final CompoundTag write(HolderLookup.Provider registries) { CompoundTag dataCopy = data.copy(); writeAdditional(registries, dataCopy); tag.putString("Id", getId().toString()); + tag.put("Data", dataCopy); return tag; } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java index 9a9a5591c4..18fb76260b 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java @@ -13,7 +13,6 @@ import net.neoforged.api.distmarker.OnlyIn; public abstract class TextScheduleInstruction extends ScheduleInstruction { - protected String getLabelText() { return textData("Text"); } diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index adf1ffd470..c898048de4 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -72,6 +72,7 @@ public void read(CompoundTag nbt, HolderLookup.Provider registries, boolean migr port.address = c.getString("Address"); port.offlineBuffer.deserializeNBT(registries, c.getCompound("OfflineBuffer")); port.primed = c.getBoolean("Primed"); + port.usesRegex = c.getBoolean("UsesRegex"); connectedPorts.put(NBTHelper.readBlockPos(c, "Pos"), port); }); } @@ -96,6 +97,7 @@ public void write(CompoundTag nbt, HolderLookup.Provider registries, DimensionPa c.putString("Address", e.getValue().address); c.put("OfflineBuffer", e.getValue().offlineBuffer.serializeNBT(registries)); c.putBoolean("Primed", e.getValue().primed); + c.putBoolean("UsesRegex", e.getValue().usesRegex); c.put("Pos", NbtUtils.writeBlockPos(e.getKey())); return c; })); @@ -166,6 +168,7 @@ public Train getNearestTrain() { // Package Port integration public static class GlobalPackagePort { public String address = ""; + public boolean usesRegex = false; public ItemStackHandler offlineBuffer = new ItemStackHandler(18); public boolean primed = false; } @@ -205,7 +208,7 @@ public void runMailTransfer() { ItemStack stack = postboxInventory.getStackInSlot(slot); if (!PackageItem.isPackage(stack)) continue; - if (PackageItem.matchAddress(stack, port.address)) + if (PackageItem.matchAddress(stack, port.address, port.usesRegex)) continue; ItemStack result = ItemHandlerHelper.insertItemStacked(carriageInventory, stack, false); @@ -230,7 +233,7 @@ public void runMailTransfer() { BlockPos pos = entry.getKey(); PostboxBlockEntity box = null; - if (!PackageItem.matchAddress(stack, port.address)) + if (!PackageItem.matchAddress(stack, port.address, port.usesRegex)) continue; IItemHandler postboxInventory = port.offlineBuffer; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 375f06df8b..d7fcfc63de 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -62,7 +62,6 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import dan200.computercraft.api.peripheral.PeripheralCapability; import net.createmod.catnip.data.Iterate; import net.createmod.catnip.nbt.NBTHelper; import net.createmod.catnip.math.VecHelper; @@ -999,6 +998,7 @@ public void attachPackagePort(PackagePortBlockEntity ppbe) { GlobalPackagePort globalPackagePort = new GlobalPackagePort(); globalPackagePort.address = ppbe.addressFilter; + globalPackagePort.usesRegex = ppbe.usingRegex(); station.connectedPorts.put(ppbe.getBlockPos(), globalPackagePort); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index e8551a3bfb..bb994d4617 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -165,10 +165,11 @@ public class AllIcons implements ScreenElement { I_SEND_ONLY = newRow(), I_SEND_AND_RECEIVE = next(), + I_GLOB_PATTERN = next(), + I_REGEX = next(), I_PARTIAL_REQUESTS = next(), I_FULL_REQUESTS = next(), I_MOVE_GAUGE = next(); - ; public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java index 08a47f0bee..2e1c38f06d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java @@ -33,6 +33,13 @@ public static List translatedOptions(String prefix, String... keys) { return result; } + public static List translatedOptions(String prefix, List keys) { + List result = new ArrayList<>(keys.size()); + for (String key : keys) + result.add(translate((prefix != null ? prefix + "." : "") + key).component()); + return result; + } + // public static LangBuilder builder() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java index 1a65470c77..7ec976eaf3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java +++ b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java @@ -11,12 +11,11 @@ public class LogisticParser { // Dynamic regex creation: // - If raw regex is enabled, uses a SAFE RE2/J parser // - Otherwise, uses the current glob parser - public static Pattern dynamicToRegex(String pattern, String defaultPatternIfError) { - boolean usingRawRegex = AllConfigs.server().logistics.useRegexForLogistics.get(); - if (usingRawRegex) { - return toRegex(pattern, defaultPatternIfError); - } - return globToRegex(pattern, defaultPatternIfError); + public static Pattern dynamicToRegex(String pattern, String defaultPatternIfError, boolean usingRawRegex) { + return usingRawRegex ? toRegex(pattern, defaultPatternIfError) : globToRegex(pattern, defaultPatternIfError); + // return AllConfigs.server().logistics.enableAdvancedRegex.get() + // ? toRegex(pattern, defaultPatternIfError) + // : globToRegex(pattern, defaultPatternIfError); } // Basic regex creation: @@ -42,4 +41,8 @@ public static Pattern globToRegex(String pattern, String defaultGlobIfError) { public static boolean anyMatches(Pattern pattern, String match) { return pattern.matcher(match).find(); } + + public static boolean matchesAll(String pattern, boolean useRegex) { + return pattern.equals(useRegex ? ".*" : "*"); + } } diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index e32fb0165a..438fbb6d36 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -8,7 +8,7 @@ public class CLogistics extends ConfigBase { public final ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); public final ConfigInt psiTimeout = i(60, 1, "psiTimeout", Comments.psiTimeout); public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); - public final ConfigBool useRegexForLogistics = b(false, "useRegexForLogistics", Comments.useRegexForLogistics); + public final ConfigBool enableAdvancedRegex = b(false, "enableAdvancedRegex", Comments.enableAdvancedRegex); public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); @@ -32,7 +32,7 @@ private static class Comments { static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; - static String useRegexForLogistics = "Whether to enable regex-based pattern matching in Frogports, Package Filters, etc."; + static String enableAdvancedRegex = "Whether to enable the use of regex-based address matching in Frogports, Package Filters, etc."; static String packagePortRange = "Maximum distance in blocks a Package Port can be placed at from its target."; static String vaultCapacity = "The total amount of stacks a vault can hold per block in size."; static String chainConveyorCapacity = "The amount of packages a chain conveyor can carry at a time."; diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index a32bf6de3ab1a543a353b3e4cf36b9de626d48f5..35779c7eda5560fb9c30e82da4f3f7f3b372de1e 100644 GIT binary patch literal 5207 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 D?`)J2 From 0522fa7b6d6d5398c94220844645dc11f8ce3872 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Thu, 10 Apr 2025 20:09:51 -0500 Subject: [PATCH 5/7] feat: Add per-block regex support for any pattern-matching blocks feat: Add tooltip data (unfinished: train station and schedule tooltips) --- .../kinetics/chainConveyor/ChainConveyorBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index a5e95d4a5d..7da5ccb904 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -421,7 +421,7 @@ public void notifyUpdate() { public boolean addLoopingPackage(ChainConveyorPackage box) { loopingPackages.add(box); - notifyUpdate(); + updatePortRegexSettings(); return true; } From f881c205c95fc2292d6863c0cd9be07615b5175c Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:27:33 -0500 Subject: [PATCH 6/7] final commits: change config locations --- .../ChainConveyorBlockEntity.java | 40 +++---------------- .../ChainConveyorRoutingTable.java | 5 +-- .../logistics/filter/PackageFilterMenu.java | 2 +- .../packagePort/PackagePortBlockEntity.java | 6 +-- .../packagePort/PackagePortScreen.java | 4 +- .../packagePort/PackagePortTarget.java | 10 ++++- .../display/GlobalTrainDisplayData.java | 2 +- .../destination/DestinationInstruction.java | 3 +- .../destination/FetchPackagesInstruction.java | 2 +- .../foundation/utility/LogisticParser.java | 7 ++-- .../infrastructure/config/AllConfigs.java | 2 + .../create/infrastructure/config/CExtras.java | 17 ++++++++ .../infrastructure/config/CLogistics.java | 3 -- .../create/infrastructure/config/CServer.java | 4 +- 14 files changed, 48 insertions(+), 59 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/config/CExtras.java diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 7da5ccb904..13e34aab5a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -21,7 +21,6 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.ChainConveyorOBB; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.ServerSpeedProvider; @@ -58,8 +57,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import org.checkerframework.checker.units.qual.C; - public class ChainConveyorBlockEntity extends KineticBlockEntity implements TransformableBlockEntity { public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { @@ -89,30 +86,6 @@ public ChainConveyorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockSt checkInvalid = true; } - private void updatePortRegexSettings() { - updatePortsRegexSettings(travelPorts); - updatePortsRegexSettings(loopPorts); - notifyUpdate(); - } - - private void updatePortsRegexSettings(Map ports) { - for (Entry entry : ports.entrySet()) { - BlockPos targetPos = entry.getKey(); - ConnectedPort port = entry.getValue(); - if (port.usesRegex()) continue; - - BlockEntity be = level.getBlockEntity(worldPosition.offset(targetPos)); - boolean newState = be instanceof PackagePortBlockEntity ppbe && ppbe.usingRegex(); - - if (newState != port.usesRegex) { - ports.put(targetPos, new ConnectedPort(port.chainPosition(), - port.connection(), - port.filter(), - newState)); - } - } - } - @Override protected AABB createRenderBoundingBox() { return new AABB(worldPosition).inflate(connections.isEmpty() ? 3 : 64); @@ -132,11 +105,9 @@ public boolean canAcceptMorePackages() { public boolean canAcceptPackagesFor(@Nullable BlockPos connection) { if (connection == null && !canAcceptMorePackages()) return false; - if (connection != null - && (!(level.getBlockEntity(worldPosition.offset(connection)) instanceof ChainConveyorBlockEntity otherClbe) - || !otherClbe.canAcceptMorePackages())) - return false; - return true; + return connection == null + || (level.getBlockEntity(worldPosition.offset(connection)) instanceof ChainConveyorBlockEntity otherClbe + && otherClbe.canAcceptMorePackages()); } public boolean canAcceptMorePackagesFromOtherConveyor() { @@ -421,7 +392,7 @@ public void notifyUpdate() { public boolean addLoopingPackage(ChainConveyorPackage box) { loopingPackages.add(box); - updatePortRegexSettings(); + notifyUpdate(); return true; } @@ -820,8 +791,7 @@ public void transform(BlockEntity be, StructureTransform transform) { .toList()); HashMap> newMap = new HashMap<>(); - travellingPackages.entrySet() - .forEach(e -> newMap.put(transform.applyWithoutOffset(e.getKey()), e.getValue())); + travellingPackages.forEach((key, value) -> newMap.put(transform.applyWithoutOffset(key), value)); travellingPackages = newMap; connectionStats = null; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java index 915899c2c7..3493bcfe63 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRoutingTable.java @@ -4,11 +4,10 @@ import java.util.Collection; import java.util.List; -import com.simibubi.create.foundation.utility.LogisticParser; - import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.utility.LogisticParser; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -52,7 +51,7 @@ public boolean shouldAdvertise() { } public void receivePortInfo(String filter, boolean usesRegex, BlockPos connection) { - insert(new RoutingTableEntry(filter, usesRegex, LogisticParser.matchesAll(filter, usesRegex) ? 1000 : 0, connection, new MutableInt(PORT_ENTRY_TIMEOUT), true)); + insert(new RoutingTableEntry(filter, usesRegex, LogisticParser.matchesAll(filter, usesRegex) ? Integer.MAX_VALUE : 0, connection, new MutableInt(PORT_ENTRY_TIMEOUT), true)); } public BlockPos getExitFor(ItemStack box) { diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java index 18bbdbff56..afaab6e8f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java @@ -62,7 +62,7 @@ protected void initAndReadInventory(ItemStack filterItem) { } public boolean usingRegex() { - return AllConfigs.server().logistics.enableAdvancedRegex.get() && useRegex; + return AllConfigs.server().extras.enableAdvancedRegex.get() && useRegex; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 09f4c5f54b..83fa15d6a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -12,7 +12,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; - import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.codecs.CatnipCodecUtils; @@ -65,7 +64,6 @@ public boolean isBackedUp() { public void filterChanged() { if (target != null) { - System.out.println("FilterChanged Event"); target.deregister(this, level, worldPosition); target.register(this, level, worldPosition); } @@ -83,7 +81,7 @@ public String getFilterString() { } public boolean usingRegex() { - return usesRegex && AllConfigs.server().logistics.enableAdvancedRegex.get(); + return usesRegex && AllConfigs.server().extras.enableAdvancedRegex.get(); } @Override @@ -93,7 +91,7 @@ protected void write(CompoundTag tag, HolderLookup.Provider registries, boolean tag.put("Target", CatnipCodecUtils.encode(PackagePortTarget.CODEC, target).orElseThrow()); tag.putString("AddressFilter", addressFilter); tag.putBoolean("AcceptsPackages", acceptsPackages); - tag.putBoolean("UsesRegex", usingRegex()); + tag.putBoolean("UsesRegex", usesRegex); tag.put("Inventory", inventory.serializeNBT(registries)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index 52c05598bc..aa0ee7167d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -127,7 +127,7 @@ protected void init() { }); useRegex.green = menu.contentHolder.usesRegex; - boolean regexEnabled = AllConfigs.server().logistics.enableAdvancedRegex.get(); + boolean regexEnabled = AllConfigs.server().extras.enableAdvancedRegex.get(); useRegex.visible = menu.contentHolder.acceptsPackages; useRegex.active = regexEnabled; @@ -204,7 +204,7 @@ protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, i .component()); List<@NotNull Component> dynamicTooltip; - if (AllConfigs.server().logistics.enableAdvancedRegex.get()) { + if (AllConfigs.server().extras.enableAdvancedRegex.get()) { dynamicTooltip = List.of( CreateLang.translate("gui.package_port.catch_packages_wildcard_regex") .style(ChatFormatting.GRAY) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index 18023473a9..9d71b37b39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -10,6 +10,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; import com.simibubi.create.api.registry.CreateBuiltInRegistries; import com.simibubi.create.api.registry.CreateRegistries; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; @@ -18,6 +19,8 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; import com.simibubi.create.content.trains.station.StationBlockEntity; +import com.simibubi.create.infrastructure.config.AllConfigs; + import io.netty.buffer.ByteBuf; import net.createmod.catnip.codecs.stream.CatnipStreamCodecBuilders; import net.minecraft.core.BlockPos; @@ -125,8 +128,10 @@ public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, bool @Override public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) + if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) { + Create.LOGGER.warn("No valid attached ChainConveyor"); return; + } ChainConveyorBlockEntity actualBe = clbe; // Jump to opposite chain if motion reversed @@ -153,9 +158,10 @@ public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos String portFilter = ppbe.getFilterString(); if (portFilter == null) return; - actualBe.routingTable.receivePortInfo(portFilter, ppbe.usesRegex, connection == null ? BlockPos.ZERO : connection); + actualBe.routingTable.receivePortInfo(portFilter, ppbe.usingRegex(), connection == null ? BlockPos.ZERO : connection); Map portMap = connection == null ? actualBe.loopPorts : actualBe.travelPorts; portMap.put(relativePos.multiply(-1), new ConnectedPort(chainPos, connection, portFilter, ppbe.usingRegex())); + actualBe.notifyUpdate(); } @Override diff --git a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java index b6a3caef6c..724bf37c94 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java +++ b/src/main/java/com/simibubi/create/content/trains/display/GlobalTrainDisplayData.java @@ -33,7 +33,7 @@ public static void refresh() { } public static List prepare(String filter, int maxLines) { - Pattern regex = LogisticParser.toRegex(filter, ""); + Pattern regex = LogisticParser.globToRegex(filter, ""); return statusByDestination.entrySet() .stream() .filter(e -> LogisticParser.anyMatches(regex, e.getKey())) diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java index 79bfb35aec..50a0ee094f 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java @@ -60,7 +60,7 @@ public ItemStack getSecondLineIcon() { @Override @OnlyIn(Dist.CLIENT) public void initConfigurationWidgets(ModularGuiLineBuilder builder) { - List<@NotNull String> scrollInputOptions = AllConfigs.server().logistics.enableAdvancedRegex.get() + List<@NotNull String> scrollInputOptions = AllConfigs.server().extras.enableAdvancedRegex.get() ? List.of("use_glob", "use_regex") : List.of("use_glob"); @@ -77,7 +77,6 @@ public void initConfigurationWidgets(ModularGuiLineBuilder builder) { } public boolean useRegex() { - Create.LOGGER.info("Regex key was " + data.getInt("UseRegex")); return data.getInt("UseRegex") == 1; } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java index ff88c1317c..077746bddf 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java @@ -73,7 +73,7 @@ public ItemStack getSecondLineIcon() { @Override @OnlyIn(Dist.CLIENT) public void initConfigurationWidgets(ModularGuiLineBuilder builder) { - List<@NotNull String> scrollInputOptions = AllConfigs.server().logistics.enableAdvancedRegex.get() + List<@NotNull String> scrollInputOptions = AllConfigs.server().extras.enableAdvancedRegex.get() ? List.of("use_glob", "use_regex") : List.of("use_glob"); diff --git a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java index 7ec976eaf3..7105d31a23 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java +++ b/src/main/java/com/simibubi/create/foundation/utility/LogisticParser.java @@ -1,19 +1,18 @@ package com.simibubi.create.foundation.utility; +import java.util.regex.PatternSyntaxException; + import com.google.re2j.Pattern; -import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.data.Glob; -import java.util.regex.PatternSyntaxException; - public class LogisticParser { // Dynamic regex creation: // - If raw regex is enabled, uses a SAFE RE2/J parser // - Otherwise, uses the current glob parser public static Pattern dynamicToRegex(String pattern, String defaultPatternIfError, boolean usingRawRegex) { return usingRawRegex ? toRegex(pattern, defaultPatternIfError) : globToRegex(pattern, defaultPatternIfError); - // return AllConfigs.server().logistics.enableAdvancedRegex.get() + // return AllConfigs.server().extras.enableAdvancedRegex.get() // ? toRegex(pattern, defaultPatternIfError) // : globToRegex(pattern, defaultPatternIfError); } diff --git a/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java b/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java index 7ec56c39b6..f968bc1d37 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java @@ -5,6 +5,8 @@ import java.util.Map.Entry; import java.util.function.Supplier; +import com.simibubi.create.Create; + import net.createmod.catnip.config.ConfigBase; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CExtras.java b/src/main/java/com/simibubi/create/infrastructure/config/CExtras.java new file mode 100644 index 0000000000..c889b6fde1 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/config/CExtras.java @@ -0,0 +1,17 @@ +package com.simibubi.create.infrastructure.config; + +import net.createmod.catnip.config.ConfigBase; + +public class CExtras extends ConfigBase { + + public final ConfigBool enableAdvancedRegex = b(false, "enableAdvancedRegex", "[requires restart]", Comments.enableAdvancedRegex); + + @Override + public String getName() { + return "extras"; + } + + private static class Comments { + static String enableAdvancedRegex = "Whether to enable the use of regex-based address matching in package logistics and train schedules."; + } +} diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index 438fbb6d36..cd17577952 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -1,6 +1,5 @@ package com.simibubi.create.infrastructure.config; - import net.createmod.catnip.config.ConfigBase; public class CLogistics extends ConfigBase { @@ -8,7 +7,6 @@ public class CLogistics extends ConfigBase { public final ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); public final ConfigInt psiTimeout = i(60, 1, "psiTimeout", Comments.psiTimeout); public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); - public final ConfigBool enableAdvancedRegex = b(false, "enableAdvancedRegex", Comments.enableAdvancedRegex); public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); @@ -32,7 +30,6 @@ private static class Comments { static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; - static String enableAdvancedRegex = "Whether to enable the use of regex-based address matching in Frogports, Package Filters, etc."; static String packagePortRange = "Maximum distance in blocks a Package Port can be placed at from its target."; static String vaultCapacity = "The total amount of stacks a vault can hold per block in size."; static String chainConveyorCapacity = "The amount of packages a chain conveyor can carry at a time."; diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CServer.java b/src/main/java/com/simibubi/create/infrastructure/config/CServer.java index 4ff528019c..8cf9d71788 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CServer.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CServer.java @@ -14,7 +14,8 @@ public class CServer extends ConfigBase { public final CLogistics logistics = nested(0, CLogistics::new, Comments.logistics); public final CSchematics schematics = nested(0, CSchematics::new, Comments.schematics); public final CEquipment equipment = nested(0, CEquipment::new, Comments.equipment); - public final CTrains trains = nested(0, CTrains::new, Comments.trains); + public final CTrains trains = nested(1, CTrains::new, Comments.trains); + public final CExtras extras = nested(0, CExtras::new, Comments.extras); @Override public String getName() { @@ -29,6 +30,7 @@ private static class Comments { static String logistics = "Tweaks for logistical components"; static String equipment = "Equipment and gadgets added by Create"; static String trains = "Create's builtin Railway systems"; + static String extras = "Advanced options for additional customization"; static String infrastructure = "The Backbone of Create"; static String tickrateSyncTimer = "The amount of time a server waits before sending out tickrate synchronization packets."; From 2a1899aca3f774ddc95c3724a544b32bc1fc6fc4 Mon Sep 17 00:00:00 2001 From: "Mo Talafuse (The GLaDOS)" <62037395+meawplex-plus@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:44:24 -0500 Subject: [PATCH 7/7] re-add FTB libraries after PR #1 --- build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index a6969b1732..c694d91fdf 100644 --- a/build.gradle +++ b/build.gradle @@ -175,10 +175,9 @@ dependencies { } runtimeOnly("dev.architectury:architectury-neoforge:13.0.8") - // Commented out because these Maven pages don't appear to exist, and are only extra compat (not important) -// implementation("dev.ftb.mods:ftb-chunks-neoforge:2101.1.1") -// implementation("dev.ftb.mods:ftb-teams-neoforge:2101.1.0") -// implementation("dev.ftb.mods:ftb-library-neoforge:2101.1.3") + implementation("dev.ftb.mods:ftb-chunks-neoforge:2101.1.1") + implementation("dev.ftb.mods:ftb-teams-neoforge:2101.1.0") + implementation("dev.ftb.mods:ftb-library-neoforge:2101.1.3") implementation("maven.modrinth:journeymap:1.21.1-6.0.0-beta.32+neoforge") implementation("info.journeymap:journeymap-api-neoforge:2.0.0-1.21.1-SNAPSHOT") {