Skip to content

Commit 34a8aaf

Browse files
authored
Merge pull request #14 from FTBTeam/dev
Dev
2 parents dc0f8e3 + e0e92d5 commit 34a8aaf

20 files changed

+269
-14
lines changed

Diff for: .github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Java CI - Build on Push
22

33
on:
44
push:
5-
branches: [ main, dev, "1.*" ]
5+
branches: [ main, dev, "1.**" ]
66
workflow_dispatch:
77
inputs:
88
skip_maven_publish:

Diff for: CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [2.1.0]
8+
9+
### Added
10+
11+
* Added FTB Quests integration for Item Filters and FTB Filter System mods
12+
* FTB Quests 2001.3.0 now required; it now supports external filtering mods via an abstraction layer
13+
* Item Filter is no longer a hard dependency for FTB Quests; it's supported along with FTB Filter System by FTB XMod Compat
14+
715
## [2.0.4]
816

917
### Fixed

Diff for: README.md

+8
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,18 @@ If either REI or JEI is present:
2828
* FTB Quests will use that mod for displaying the items obtained from any configured loot crates (rewards from the reward table which have loot crates enabled)
2929
* FTB Quests will use that mod to show the recipes for items in item tasks (as viewed in the quest display panel)
3030

31+
### Item Filters and FTB Filter System
32+
33+
As of version 2.1.0, FTB XMod Compat provides FTB Quests integration for the Item Filters and FTB Filter System mods. Item Filters was previously a hard dependency for FTB Quests, but is now an optional dependency, along with the new FTB Filter System mod. Using FTB Filter System will be the recommended path for future modpacks.
34+
35+
With KubeJS installed, FTB Filter System's "Custom" filter fires a KubeJS event allowing pack developers to match items using an external KJS script. See https://github.com/FTBTeam/FTB-Filter-System/blob/main/README.md for more information on this, including examples.
36+
3137
### Fallbacks
3238

3339
If neither KubeJS nor Game Stages is loaded, FTB Quests will use an inbuilt stages implementation based on string "tags" which can be added to players. This works but is extremely limited in functionality (either a player has a given tag, or doesn't).
3440

41+
If neither Item Filters nor FTB Filter System is load, only simple item matching will be available for FTB Quests item tasks.
42+
3543
## FTB Chunks
3644

3745
The following cross-mod integrations are added to FTB Chunks 1902.4.0+, if present:

Diff for: common/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ dependencies {
1919
modApi("dev.ftb.mods:ftb-ranks:${rootProject.ftb_ranks_version}")
2020
modApi("dev.ftb.mods:ftb-essentials:${rootProject.ftb_essentials_version}")
2121
modApi("dev.ftb.mods:ftb-teams:${rootProject.ftb_teams_version}")
22+
modApi("dev.ftb.mods:ftb-filter-system:${rootProject.ftb_filter_system_version}")
2223

2324
modCompileOnly("me.shedaniel:RoughlyEnoughItems-api:${rootProject.rei_version}")
2425
modCompileOnly("mezz.jei:jei-${rootProject.minecraft_version}-common-api:${rootProject.jei_version}")
2526

2627
compileOnly("net.luckperms:api:${rootProject.luckperms_api_version}")
2728

2829
modCompileOnlyApi "dev.latvian.mods:kubejs:${rootProject.kubejs_version}"
30+
modCompileOnlyApi "dev.latvian.mods:item-filters:${rootProject.itemfilters_version}"
2931
}
3032

3133
publishing {

Diff for: common/src/main/java/dev/ftb/mods/ftbxmodcompat/FTBXModCompat.java

+4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ public class FTBXModCompat {
1919
public static boolean isFTBChunksLoaded;
2020
public static boolean isFTBRanksLoaded;
2121
public static boolean isFTBEssentialsLoaded;
22+
public static boolean isFTBFilterSystemLoaded;
2223

2324
public static boolean isKubeJSLoaded;
25+
public static boolean isItemFiltersLoaded;
2426
public static boolean isGameStagesLoaded;
2527
public static boolean isREILoaded;
2628
public static boolean isJEILoaded;
@@ -48,8 +50,10 @@ private static void detectLoadedMods() {
4850
isFTBChunksLoaded = Platform.isModLoaded("ftbchunks");
4951
isFTBRanksLoaded = Platform.isModLoaded("ftbranks");
5052
isFTBEssentialsLoaded = Platform.isModLoaded("ftbessentials");
53+
isFTBFilterSystemLoaded = Platform.isModLoaded("ftbfiltersystem");
5154

5255
isKubeJSLoaded = Platform.isModLoaded("kubejs");
56+
isItemFiltersLoaded = Platform.isModLoaded("itemfilters");
5357
isGameStagesLoaded = Platform.isModLoaded("gamestages");
5458
isREILoaded = Platform.isModLoaded("roughlyenoughitems");
5559
isJEILoaded = Platform.isModLoaded("jei");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbfiltersystem.kubejs;
2+
3+
import dev.latvian.mods.kubejs.event.EventJS;
4+
import net.minecraft.world.item.ItemStack;
5+
6+
public class CustomFilterEventJS extends EventJS {
7+
private final ItemStack stack;
8+
private final String data;
9+
10+
public CustomFilterEventJS(ItemStack stack, String data) {
11+
this.stack = stack;
12+
this.data = data;
13+
}
14+
15+
public ItemStack getStack() {
16+
return stack;
17+
}
18+
19+
public String getData() {
20+
return data;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbfiltersystem.kubejs;
2+
3+
import dev.latvian.mods.kubejs.event.EventGroup;
4+
import dev.latvian.mods.kubejs.event.EventHandler;
5+
import dev.latvian.mods.kubejs.event.Extra;
6+
7+
public interface FFSEvents {
8+
EventGroup EVENT_GROUP = EventGroup.of("FTBFilterSystemEvents");
9+
10+
EventHandler CUSTOM_FILTER = EVENT_GROUP.server("customFilter", () -> CustomFilterEventJS.class).extra(Extra.STRING).hasResult();
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbfiltersystem.kubejs;
2+
3+
import dev.architectury.event.EventResult;
4+
import dev.ftb.mods.ftbfiltersystem.api.event.CustomFilterEvent;
5+
import dev.latvian.mods.kubejs.KubeJSPlugin;
6+
import dev.latvian.mods.kubejs.script.ScriptType;
7+
import net.minecraft.world.item.ItemStack;
8+
9+
public class FFSKubeJSPlugin extends KubeJSPlugin {
10+
@Override
11+
public void init() {
12+
CustomFilterEvent.MATCH_ITEM.register(FFSKubeJSPlugin::onCustomFilter);
13+
}
14+
15+
@Override
16+
public void registerEvents() {
17+
FFSEvents.EVENT_GROUP.register();
18+
}
19+
20+
private static EventResult onCustomFilter(ItemStack stack, String eventId, String extraData) {
21+
return FFSEvents.CUSTOM_FILTER.post(ScriptType.SERVER, eventId, new CustomFilterEventJS(stack, extraData)).arch();
22+
}
23+
}

Diff for: common/src/main/java/dev/ftb/mods/ftbxmodcompat/ftbquests/FTBQuestsSetup.java

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.ftb.mods.ftbquests.FTBQuests;
44
import dev.ftb.mods.ftbxmodcompat.FTBXModCompat;
5+
import dev.ftb.mods.ftbxmodcompat.ftbquests.filtering.ItemFilteringSetup;
56
import dev.ftb.mods.ftbxmodcompat.ftbquests.jei.helper.JEIRecipeHelper;
67
import dev.ftb.mods.ftbxmodcompat.ftbquests.rei.helper.REIRecipeHelper;
78

@@ -13,5 +14,7 @@ public static void init() {
1314
FTBQuests.setRecipeModHelper(new REIRecipeHelper());
1415
}
1516
FTBXModCompat.LOGGER.info("[FTB Quests] recipe helper provider is [{}]", FTBQuests.getRecipeModHelper().getHelperName());
17+
18+
ItemFilteringSetup.init();
1619
}
1720
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbquests.filtering;
2+
3+
import dev.ftb.mods.ftbfiltersystem.api.FTBFilterSystemAPI;
4+
import dev.ftb.mods.ftbfiltersystem.api.FilterException;
5+
import dev.ftb.mods.ftbfiltersystem.api.filter.SmartFilter;
6+
import dev.ftb.mods.ftbquests.FTBQuests;
7+
import dev.ftb.mods.ftbquests.api.FTBQuestsAPI;
8+
import dev.ftb.mods.ftbquests.api.ItemFilterAdapter;
9+
import dev.ftb.mods.ftbxmodcompat.FTBXModCompat;
10+
import net.minecraft.tags.TagKey;
11+
import net.minecraft.world.item.Item;
12+
import net.minecraft.world.item.ItemStack;
13+
14+
class FFSSetup {
15+
public static void init() {
16+
FTBQuestsAPI.api().registerFilterAdapter(new FFSAdapter());
17+
FTBXModCompat.LOGGER.info("[FTB Quests] Enabled FTB Filter System integration");
18+
}
19+
20+
private static class FFSAdapter implements ItemFilterAdapter {
21+
@Override
22+
public String getName() {
23+
return "FTB Filter System";
24+
}
25+
26+
@Override
27+
public boolean isFilterStack(ItemStack stack) {
28+
return FTBFilterSystemAPI.api().isFilterItem(stack);
29+
}
30+
31+
@Override
32+
public boolean doesItemMatch(ItemStack filterStack, ItemStack toCheck) {
33+
return FTBFilterSystemAPI.api().doesFilterMatch(filterStack, toCheck);
34+
}
35+
36+
@Override
37+
public Matcher getMatcher(ItemStack filterStack) {
38+
try {
39+
return new FFSMatcher(filterStack);
40+
} catch (FilterException e) {
41+
return ItemFilterAdapter.NO_MATCH;
42+
}
43+
}
44+
45+
@Override
46+
public ItemStack makeTagFilterStack(TagKey<Item> tag) {
47+
return FTBFilterSystemAPI.api().makeTagFilter(tag);
48+
}
49+
}
50+
51+
private static class FFSMatcher implements ItemFilterAdapter.Matcher {
52+
private final SmartFilter smartFilter;
53+
54+
public FFSMatcher(ItemStack filterStack) {
55+
smartFilter = FTBFilterSystemAPI.api().parseFilter(filterStack);
56+
}
57+
58+
@Override
59+
public boolean test(ItemStack stack) {
60+
return smartFilter.test(stack);
61+
}
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbquests.filtering;
2+
3+
import dev.ftb.mods.ftbxmodcompat.FTBXModCompat;
4+
5+
public class ItemFilteringSetup {
6+
public static void init() {
7+
if (FTBXModCompat.isFTBFilterSystemLoaded) {
8+
FFSSetup.init();
9+
}
10+
if (FTBXModCompat.isItemFiltersLoaded) {
11+
ItemFiltersSetup.init();
12+
}
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbquests.filtering;
2+
3+
import dev.ftb.mods.ftbquests.api.FTBQuestsAPI;
4+
import dev.ftb.mods.ftbquests.api.ItemFilterAdapter;
5+
import dev.ftb.mods.ftbxmodcompat.FTBXModCompat;
6+
import dev.latvian.mods.itemfilters.api.IItemFilter;
7+
import dev.latvian.mods.itemfilters.api.IStringValueFilter;
8+
import dev.latvian.mods.itemfilters.api.ItemFiltersAPI;
9+
import dev.latvian.mods.itemfilters.api.ItemFiltersItems;
10+
import net.minecraft.tags.TagKey;
11+
import net.minecraft.world.item.Item;
12+
import net.minecraft.world.item.ItemStack;
13+
14+
class ItemFiltersSetup {
15+
public static void init() {
16+
FTBQuestsAPI.api().registerFilterAdapter(new ItemFiltersAdapter());
17+
FTBXModCompat.LOGGER.info("[FTB Quests] Enabled Item Filters integration");
18+
}
19+
20+
private static class ItemFiltersAdapter implements ItemFilterAdapter {
21+
@Override
22+
public String getName() {
23+
return "Item Filters";
24+
}
25+
26+
@Override
27+
public boolean isFilterStack(ItemStack stack) {
28+
return ItemFiltersAPI.isFilter(stack);
29+
}
30+
31+
@Override
32+
public boolean doesItemMatch(ItemStack filterStack, ItemStack toCheck) {
33+
return ItemFiltersAPI.isFilter(filterStack) && ItemFiltersAPI.filter(filterStack, toCheck);
34+
}
35+
36+
@Override
37+
public Matcher getMatcher(ItemStack filterStack) {
38+
return new IFMatcher(filterStack);
39+
}
40+
41+
@Override
42+
public ItemStack makeTagFilterStack(TagKey<Item> tag) {
43+
ItemStack tagFilter = new ItemStack(ItemFiltersItems.TAG.get());
44+
((IStringValueFilter) tagFilter.getItem()).setValue(tagFilter, tag.location().toString());
45+
return tagFilter;
46+
}
47+
}
48+
49+
private static class IFMatcher implements ItemFilterAdapter.Matcher {
50+
private final ItemStack filterStack;
51+
private final IItemFilter filter;
52+
53+
private IFMatcher(ItemStack filterStack) {
54+
this.filterStack = filterStack;
55+
this.filter = ItemFiltersAPI.getFilter(filterStack);
56+
}
57+
58+
@Override
59+
public boolean test(ItemStack stack) {
60+
return filter != null && filter.filter(filterStack, stack);
61+
}
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.ftb.mods.ftbxmodcompat.ftbquests.kubejs;
2+
3+
import dev.ftb.mods.ftbquests.api.event.CustomFilterDisplayItemsEvent;
4+
import dev.latvian.mods.kubejs.event.EventJS;
5+
import net.minecraft.world.item.ItemStack;
6+
7+
import java.util.Collection;
8+
9+
public class CustomFilterItemEventJS extends EventJS {
10+
private final CustomFilterDisplayItemsEvent event;
11+
12+
public CustomFilterItemEventJS(CustomFilterDisplayItemsEvent event) {
13+
this.event = event;
14+
}
15+
16+
public void addStack(ItemStack stack) {
17+
event.add(stack);
18+
}
19+
20+
public void addStacks(Collection<ItemStack> stacks) {
21+
event.add(stacks);
22+
}
23+
}

Diff for: common/src/main/java/dev/ftb/mods/ftbxmodcompat/ftbquests/kubejs/FTBQuestsKubeJSEvents.java

+2
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public interface FTBQuestsKubeJSEvents {
1111
EventHandler CUSTOM_REWARD = EVENT_GROUP.server("customReward", () -> CustomRewardEventJS.class).extra(Extra.STRING).hasResult();
1212
EventHandler OBJECT_COMPLETED = EVENT_GROUP.server("completed", () -> QuestObjectCompletedEventJS.class).extra(Extra.STRING);
1313
EventHandler OBJECT_STARTED = EVENT_GROUP.server("started", () -> QuestObjectStartedEventJS.class).extra(Extra.STRING);
14+
15+
EventHandler CUSTOM_FILTER_ITEM = EVENT_GROUP.client("customFilterItem", () -> CustomFilterItemEventJS.class);
1416
}

Diff for: common/src/main/java/dev/ftb/mods/ftbxmodcompat/ftbquests/kubejs/KubeJSIntegration.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.ftb.mods.ftbxmodcompat.ftbquests.kubejs;
22

33
import dev.architectury.event.EventResult;
4+
import dev.ftb.mods.ftbquests.api.event.CustomFilterDisplayItemsEvent;
45
import dev.ftb.mods.ftbquests.events.CustomRewardEvent;
56
import dev.ftb.mods.ftbquests.events.CustomTaskEvent;
67
import dev.ftb.mods.ftbquests.events.ObjectCompletedEvent;
@@ -16,11 +17,13 @@
1617
import net.minecraft.world.entity.player.Player;
1718

1819
public class KubeJSIntegration extends KubeJSPlugin {
20+
@Override
1921
public void init() {
2022
CustomTaskEvent.EVENT.register(KubeJSIntegration::onCustomTask);
2123
CustomRewardEvent.EVENT.register(KubeJSIntegration::onCustomReward);
2224
ObjectCompletedEvent.GENERIC.register(KubeJSIntegration::onCompleted);
2325
ObjectStartedEvent.GENERIC.register(KubeJSIntegration::onStarted);
26+
CustomFilterDisplayItemsEvent.ADD_ITEMSTACK.register(KubeJSIntegration::onCustomFilterItem);
2427

2528
Stages.added(event -> {
2629
if (event.getPlayer() instanceof ServerPlayer sp) StageTask.checkStages(sp);
@@ -29,7 +32,7 @@ public void init() {
2932
if (event.getPlayer() instanceof ServerPlayer sp) StageTask.checkStages(sp);
3033
});
3134

32-
FTBXModCompat.LOGGER.info("FTB Quests: Enabled KubeJS integration");
35+
FTBXModCompat.LOGGER.info("[FTB Quests] Enabled KubeJS integration");
3336
}
3437

3538
@Override
@@ -47,6 +50,10 @@ public void registerEvents() {
4750
FTBQuestsKubeJSEvents.EVENT_GROUP.register();
4851
}
4952

53+
private static void onCustomFilterItem(CustomFilterDisplayItemsEvent event) {
54+
FTBQuestsKubeJSEvents.CUSTOM_FILTER_ITEM.post(ScriptType.CLIENT, new CustomFilterItemEventJS(event));
55+
}
56+
5057
public static EventResult onCustomTask(CustomTaskEvent event) {
5158
return FTBQuestsKubeJSEvents.CUSTOM_TASK.post(ScriptType.SERVER, event.getTask(), new CustomTaskEventJS(event)).arch();
5259
}

Diff for: common/src/main/java/dev/ftb/mods/ftbxmodcompat/ftbquests/rei/FTBQuestsREIIntegration.java

+6
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33
import dev.ftb.mods.ftbxmodcompat.FTBXModCompat;
44
import dev.ftb.mods.ftbxmodcompat.ftbquests.recipemod_common.WrappedLootCrate;
55
import dev.ftb.mods.ftbxmodcompat.ftbquests.recipemod_common.WrappedQuest;
6+
import me.shedaniel.math.Rectangle;
67
import me.shedaniel.rei.api.client.entry.filtering.base.BasicFilteringRule;
78
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
89
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
910
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
11+
import me.shedaniel.rei.api.client.registry.screen.ExclusionZones;
12+
import me.shedaniel.rei.api.client.registry.screen.ExclusionZonesProvider;
1013
import me.shedaniel.rei.api.client.view.ViewSearchBuilder;
1114
import me.shedaniel.rei.api.common.entry.EntryStack;
1215
import me.shedaniel.rei.api.common.entry.type.EntryDefinition;
1316
import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry;
1417
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
18+
import net.minecraft.client.gui.screens.Screen;
1519
import net.minecraft.world.item.ItemStack;
1620

21+
import java.util.Collection;
22+
1723
public class FTBQuestsREIIntegration implements REIClientPlugin {
1824
private static BasicFilteringRule.MarkDirty cratesChanged;
1925

0 commit comments

Comments
 (0)