diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4935275b..c91ba830 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+# [2100.1.3]
+
+### Fixed
+* Fixed adding tasks to existing quests sometimes losing the task type (leading to a '?' button appearing)
+* Fixed images in the quest book not sync'ing to the client
+* Fixed issue where using FTB Filter System filters would sometimes fail to find matching items for GUI display
+
# [2100.1.2]
### Fixed
diff --git a/build.gradle b/build.gradle
index bf55fcd0..724df26b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -100,7 +100,7 @@ publishMods {
// TODO: Migrate to something else
def tag = providers.environmentVariable("TAG").getOrElse("release")
- type = tag == "beta" ? BETA : (tag == "alpha" ? ALPHA : STABLE)
+ type = tag.endsWith("-beta") ? BETA : (tag.endsWith("-alpha") ? ALPHA : STABLE)
def createOptions = (String projectName) -> {
publishOptions {
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/api/event/CustomFilterDisplayItemsEvent.java b/common/src/main/java/dev/ftb/mods/ftbquests/api/event/CustomFilterDisplayItemsEvent.java
index f8bd7991..c2727475 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/api/event/CustomFilterDisplayItemsEvent.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/api/event/CustomFilterDisplayItemsEvent.java
@@ -2,11 +2,27 @@
import dev.architectury.event.Event;
import dev.architectury.event.EventFactory;
+import dev.ftb.mods.ftbquests.FTBQuests;
import net.minecraft.world.item.ItemStack;
import java.util.Collection;
import java.util.function.Consumer;
+/**
+ * This event is fired on the client to allow mods to register custom items to be displayed when filters (such as the
+ * Smart Filter from FTB Filter System) look for matching items for their filter. By default, only items in the creative
+ * search tab are checked for, so this event is useful for adding items with custom data components.
+ *
+ * KubeJS integration for this event is provided via FTB XMod Compat, and is the typical way for modpack makers to
+ * add custom display items for any filters they create. An example KubeJS snippet (to be placed in
+ * kubejs/client_scripts) to register an item:
+ *
+ * FTBQuestsEvents.customFilterItem(event => {
+ * event.addStack('minecraft:iron_axe {display:{Name:{text:\"Test Axe!\"}}, Damage: 50}')
+ * event.addStack('minecraft:diamond_axe {display:{Name:{text:\"Test Axe 2!\"}}, Damage: 300}')
+ * })
+ *
+ */
public class CustomFilterDisplayItemsEvent {
private final Consumer callback;
@@ -21,6 +37,6 @@ public void add(ItemStack stack) {
}
public void add(Collection stacks) {
- stacks.forEach(callback::accept);
+ stacks.forEach(callback);
}
}
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java
index de234850..f984df83 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java
@@ -162,8 +162,12 @@ public static void rebuildCreativeTabs() {
}
}
- public static Optional registryAccess() {
- return Minecraft.getInstance().level == null ? Optional.empty() : Optional.of(Minecraft.getInstance().level.registryAccess());
+ public static Optional creativeTabDisplayParams() {
+ LocalPlayer player = Minecraft.getInstance().player;
+ if (player != null) {
+ return Optional.of(new CreativeModeTab.ItemDisplayParameters(player.connection.enabledFeatures(), Minecraft.getInstance().options.operatorItemsTab().get(), player.clientLevel.registryAccess()));
+ }
+ return Optional.empty();
}
public static void copyToClipboard(QuestObjectBase qo) {
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java
index 5433124d..8f8c75ad 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java
@@ -157,7 +157,7 @@ private static void openSetupGui(Runnable gui, BiConsumer cal
ConfigGroup group = new ConfigGroup(FTBQuestsAPI.MOD_ID, accepted -> {
gui.run();
if (accepted) {
- callback.accept(task, new CompoundTag());
+ callback.accept(task, task.getType().makeExtraNBT());
}
});
task.fillConfigGroup(task.createSubGroup(group));
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java
index 28eb5ac4..a995adda 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java
@@ -1,11 +1,11 @@
package dev.ftb.mods.ftbquests.integration.item_filtering;
import com.google.common.collect.ImmutableList;
+import dev.ftb.mods.ftbquests.FTBQuests;
import dev.ftb.mods.ftbquests.api.ItemFilterAdapter;
import dev.ftb.mods.ftbquests.api.event.CustomFilterDisplayItemsEvent;
import dev.ftb.mods.ftbquests.client.FTBQuestsClient;
import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
-import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -34,9 +34,11 @@ public static List getCachedDisplayStacks(ItemStack filterStack, Item
}
private static List computeMatchingStacks(ItemFilterAdapter.Matcher matcher) {
- if (CreativeModeTabs.searchTab().getSearchTabDisplayItems().isEmpty()) {
- FTBQuestsClient.registryAccess().ifPresent(ra -> CreativeModeTabs.tryRebuildTabContents(FeatureFlags.DEFAULT_FLAGS, true, ra));
- }
+ FTBQuestsClient.creativeTabDisplayParams().ifPresent(params -> {
+ if (CreativeModeTabs.tryRebuildTabContents(params.enabledFeatures(), params.hasPermissions(), params.holders())) {
+ FTBQuests.LOGGER.debug("creative tabs rebuilt, search tab now has {} items", CreativeModeTabs.searchTab().getSearchTabDisplayItems().size());
+ }
+ });
ImmutableList.Builder builder = ImmutableList.builder();
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java
index f18521bc..a9765c84 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java
@@ -836,7 +836,8 @@ public final void writeNetData(RegistryFriendlyByteBuf buffer) {
public final void readNetData(RegistryFriendlyByteBuf buffer) {
super.readNetData(buffer);
- emergencyItems.retainAll(ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buffer));
+ emergencyItems.clear();
+ emergencyItems.addAll(ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buffer));
emergencyItemsCooldown = buffer.readVarInt();
defaultPerTeamReward = buffer.readBoolean();
defaultTeamConsumeItems = buffer.readBoolean();
diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java
index 5bcc7a0b..87ee2061 100644
--- a/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java
+++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java
@@ -21,7 +21,8 @@ public static void write(FriendlyByteBuf buffer, Collection list, BiConsu
}
public static void read(FriendlyByteBuf buffer, Collection list, Function reader) {
- list.retainAll(buffer.readList(reader::apply));
+ list.clear();
+ list.addAll(buffer.readList(reader::apply));
}
public static void writeStrings(FriendlyByteBuf buffer, Collection list) {
diff --git a/gradle.properties b/gradle.properties
index a14baed9..95b0271e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,7 +9,7 @@ maven_group=dev.ftb.mods
mod_author=FTB Team
# Build time
-mod_version=2100.1.2
+mod_version=2100.1.3
minecraft_version=1.21