Multifiltration

- Clipboards now copy invertedness of brass diodes
- Clipboards can now copy filters, consuming filter items from the players' inventory
- Fixed Filters and Attribute Filters not stacking with unmodified, equivalent stacks
- Fixed Attribute Filters saving the name tag preview item in their data
- Filters and Schedules can now be reset via crafting
- Fixed 'upto'-filter amounts not working correctly on inserting belt funnels
This commit is contained in:
simibubi 2023-04-20 15:06:55 +02:00
parent c7b0c11abc
commit ffa85dc889
18 changed files with 311 additions and 38 deletions

View File

@ -578,7 +578,7 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
e4af08f4e51db9c4a722ebff44a04e8bd9a9dba6 assets/create/lang/en_ud.json
b14838ef90096d8877aa4ca10e5b261063a41805 assets/create/lang/en_us.json
d2175e6c3f6eb92f6d92c9314014c175239a744e assets/create/lang/en_us.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
@ -2378,6 +2378,7 @@ d8331026603dacf176ef6475f0d2b4f93e1a71a8 data/create/advancements/recipes/buildi
ba80332510acab3f60f30d8b802ee2d450fd51b9 data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json
4bb60ef5e186f12a9d52e61319db8c78300c64ab data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json
00ff89f208cb9023d7a2657c43d267e21755fb2e data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_raw_ore.json
6050a12e82e081cc869b9a2a878b9da27854b022 data/create/advancements/recipes/create.base/crafting/appliances/attribute_filter_clear.json
3194b8da04cfb26f070b0a14f210f0117f252993 data/create/advancements/recipes/create.base/crafting/appliances/clipboard.json
a1746099602e91fd23fba112016d41c71f9de62e data/create/advancements/recipes/create.base/crafting/appliances/clipboard_clear.json
376bda381f3dedb52b03eb1504b103d8ddd1b672 data/create/advancements/recipes/create.base/crafting/appliances/copper_backtank.json
@ -2385,10 +2386,12 @@ a1746099602e91fd23fba112016d41c71f9de62e data/create/advancements/recipes/create
680c982dd1d3c45bed4d390fc0da5042750c157a data/create/advancements/recipes/create.base/crafting/appliances/copper_diving_helmet.json
265a953eaac909fd2817c6dc3d1a08b376579a25 data/create/advancements/recipes/create.base/crafting/appliances/crafting_blueprint.json
fa2e18298f7710465d9b0798a69288e846c646fd data/create/advancements/recipes/create.base/crafting/appliances/dough.json
048a24b84c19c47802c5aed069001925eedd087d data/create/advancements/recipes/create.base/crafting/appliances/filter_clear.json
a9b163744b1c494d07ec256d0367884f9601176d data/create/advancements/recipes/create.base/crafting/appliances/linked_controller.json
ab1e704db4a41a8d2cba357942f95c411a80a0c8 data/create/advancements/recipes/create.base/crafting/appliances/netherite_backtank.json
f714a7fa70ed9e9b0c145d466357cd1ef4de184b data/create/advancements/recipes/create.base/crafting/appliances/netherite_diving_boots.json
99efa64a74ad29cf3b6cc565eabdd9b7e7e0cc40 data/create/advancements/recipes/create.base/crafting/appliances/netherite_diving_helmet.json
4f591309b0d47e2940f60e0e43f65fdf250b0dfa data/create/advancements/recipes/create.base/crafting/appliances/schedule_clear.json
c4769d7ac9c537eb4409b02883e89d0930514a8b data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json
bb138bedd2aec741fa54b6b52be384fdbd741249 data/create/advancements/recipes/create.base/crafting/curiosities/brown_toolbox.json
773faf96b003868e35ceeb0bf738281d066e343b data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json
@ -3855,6 +3858,7 @@ ac91109efa5a253f54257904190b80a400ec6d0c data/create/recipes/compacting/diorite_
82316030429530a798020a6a31a3f1718b1123b2 data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json
64e802b3c6fc1c7e9926531cfa625d58505852f6 data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json
4c4d62d9e95c6e37ab38c49cf472034d750530c7 data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json
fab6c25ea9eeb489121c96002f361ac032ec42c9 data/create/recipes/crafting/appliances/attribute_filter_clear.json
005f8ad32598ea98314031e66b06e95e1f8ddd13 data/create/recipes/crafting/appliances/clipboard.json
db648fd89bc2030f3e1e9baa0d2b5b69238dec4c data/create/recipes/crafting/appliances/clipboard_clear.json
eb18d5972484418fa5a768633e68688ad20d2bd7 data/create/recipes/crafting/appliances/copper_backtank.json
@ -3862,10 +3866,12 @@ eb18d5972484418fa5a768633e68688ad20d2bd7 data/create/recipes/crafting/appliances
ec38ddb44e4bf8eaaba6f9d27e8469234fc98528 data/create/recipes/crafting/appliances/copper_diving_helmet.json
c077375d16b4505e52548613fbc9356993556e6b data/create/recipes/crafting/appliances/crafting_blueprint.json
edf96556bb2357f54fd398fe573641afa15239b2 data/create/recipes/crafting/appliances/dough.json
96feda6a0556a73851a41c6b7b7be1e8d9d5a028 data/create/recipes/crafting/appliances/filter_clear.json
75cdbd88973a8ca943ebe890153b01a344b96b01 data/create/recipes/crafting/appliances/linked_controller.json
9ef7bae26db471741096abd2b02f738202913994 data/create/recipes/crafting/appliances/netherite_backtank.json
e84952517f02a7c1ba10f12e2e0e32b94f720e58 data/create/recipes/crafting/appliances/netherite_diving_boots.json
664421c08143e4eb60332f53da17f70b4be83e74 data/create/recipes/crafting/appliances/netherite_diving_helmet.json
9c40eb131b4e8161654e00f47b654abf5ed75804 data/create/recipes/crafting/appliances/schedule_clear.json
7b5f863dda3d05a79cb85943a178eba0bd8a7dc7 data/create/recipes/crafting/appliances/slime_ball.json
b159ba84428eee6ef6e23df1766f2a18f2c8a63e data/create/recipes/crafting/appliances/tree_fertilizer.json
395f5fc62e27448121e3447a24a752be1a91def2 data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json

View File

@ -1099,6 +1099,7 @@
"create.logistics.filter.any_amount_short": "Any",
"create.logistics.filter.up_to": "Up to",
"create.logistics.filter.exactly": "Exactly",
"create.logistics.filter.requires_item_in_inventory": "Requires %1$s item in Inventory",
"create.logistics.creative_crate.supply": "Infinite Supply",
"create.logistics.train_observer.cargo_filter": "Cargo Filter",

View File

@ -0,0 +1,34 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/attribute_filter_clear"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"items": [
"create:attribute_filter"
]
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/attribute_filter_clear"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,34 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/filter_clear"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"items": [
"create:filter"
]
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/filter_clear"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,34 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/schedule_clear"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"items": [
"create:schedule"
]
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/schedule_clear"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View File

@ -0,0 +1,11 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "create:attribute_filter"
}
],
"result": {
"item": "create:attribute_filter"
}
}

View File

@ -0,0 +1,11 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "create:filter"
}
],
"result": {
"item": "create:filter"
}
}

View File

@ -0,0 +1,11 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "create:schedule"
}
],
"result": {
"item": "create:schedule"
}
}

View File

@ -83,7 +83,7 @@ public class BeltFunnelInteractionHandler {
else
continue;
if (amountToExtract != -1) {
if (amountToExtract != -1 && modeToExtract != ExtractionCountMode.UPTO) {
toInsert.setCount(Math.min(amountToExtract, toInsert.getCount()));
ItemStack remainder = inserting.simulate()
.insert(toInsert);

View File

@ -97,12 +97,16 @@ public class ClipboardValueSettingsHandler {
boolean canCopy = smartBE.getAllBehaviours()
.stream()
.anyMatch(b -> b instanceof ClipboardCloneable cc
&& cc.writeToClipboard(new CompoundTag(), target.getDirection()));
&& cc.writeToClipboard(new CompoundTag(), target.getDirection()))
|| smartBE instanceof ClipboardCloneable ccbe
&& ccbe.writeToClipboard(new CompoundTag(), target.getDirection());
boolean canPaste = tagElement != null && smartBE.getAllBehaviours()
boolean canPaste = tagElement != null && (smartBE.getAllBehaviours()
.stream()
.anyMatch(b -> b instanceof ClipboardCloneable cc && cc.readFromClipboard(
tagElement.getCompound(cc.getClipboardKey()), mc.player, target.getDirection(), true));
tagElement.getCompound(cc.getClipboardKey()), mc.player, target.getDirection(), true))
|| smartBE instanceof ClipboardCloneable ccbe && ccbe.readFromClipboard(
tagElement.getCompound(ccbe.getClipboardKey()), mc.player, target.getDirection(), true));
if (!canCopy && !canPaste)
return;
@ -164,6 +168,21 @@ public class ClipboardValueSettingsHandler {
tag.put(clipboardKey, compoundTag);
}
if (smartBE instanceof ClipboardCloneable ccbe) {
anyValid = true;
String clipboardKey = ccbe.getClipboardKey();
if (paste) {
anySuccess |= ccbe.readFromClipboard(tag.getCompound(clipboardKey), player, event.getFace(),
world.isClientSide());
} else {
CompoundTag compoundTag = new CompoundTag();
boolean success = ccbe.writeToClipboard(compoundTag, event.getFace());
anySuccess |= success;
if (success)
tag.put(clipboardKey, compoundTag);
}
}
if (!anyValid)
return;

View File

@ -4,19 +4,22 @@ import static com.simibubi.create.content.logistics.block.diodes.BrassDiodeBlock
import java.util.List;
import com.simibubi.create.content.curiosities.clipboard.ClipboardCloneable;
import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.scrollvalue.ScrollValueBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.DiodeBlock;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public abstract class BrassDiodeBlockEntity extends SmartBlockEntity {
public abstract class BrassDiodeBlockEntity extends SmartBlockEntity implements ClipboardCloneable {
protected int state;
ScrollValueBehaviour maxState;
@ -81,4 +84,28 @@ public abstract class BrassDiodeBlockEntity extends SmartBlockEntity {
return (value / 20 / 60) + "m";
}
@Override
public String getClipboardKey() {
return "Block";
}
@Override
public boolean readFromClipboard(CompoundTag tag, Player player, Direction side, boolean simulate) {
if (!tag.contains("Inverted"))
return false;
if (simulate)
return true;
BlockState blockState = getBlockState();
if (blockState.getValue(BrassDiodeBlock.INVERTED) != tag.getBoolean("Inverted"))
level.setBlockAndUpdate(worldPosition, blockState.cycle(BrassDiodeBlock.INVERTED));
return true;
}
@Override
public boolean writeToClipboard(CompoundTag tag, Direction side) {
tag.putBoolean("Inverted", getBlockState().getOptionalValue(BrassDiodeBlock.INVERTED)
.orElse(false));
return true;
}
}

View File

@ -141,7 +141,6 @@ public class AttributeFilterMenu extends AbstractFilterMenu {
@Override
protected void saveData(ItemStack filterItem) {
super.saveData(filterItem);
filterItem.getOrCreateTag()
.putInt("WhitelistMode", whitelistMode.ordinal());
ListTag attributes = new ListTag();
@ -156,6 +155,9 @@ public class AttributeFilterMenu extends AbstractFilterMenu {
});
filterItem.getOrCreateTag()
.put("MatchedAttributes", attributes);
if (attributes.isEmpty() && whitelistMode == WhitelistMode.WHITELIST_DISJ)
filterItem.setTag(null);
}
}

View File

@ -81,24 +81,30 @@ public class FilterItem extends Item implements MenuProvider {
private List<Component> makeSummary(ItemStack filter) {
List<Component> list = new ArrayList<>();
if (!filter.hasTag())
return list;
if (type == FilterType.REGULAR) {
ItemStackHandler filterItems = getFilterItems(filter);
boolean blacklist = filter.getOrCreateTag()
.getBoolean("Blacklist");
list.add((blacklist ? Lang.translateDirect("gui.filter.deny_list") : Lang.translateDirect("gui.filter.allow_list")).withStyle(ChatFormatting.GOLD));
list.add((blacklist ? Lang.translateDirect("gui.filter.deny_list")
: Lang.translateDirect("gui.filter.allow_list")).withStyle(ChatFormatting.GOLD));
int count = 0;
for (int i = 0; i < filterItems.getSlots(); i++) {
if (count > 3) {
list.add(Components.literal("- ...").withStyle(ChatFormatting.DARK_GRAY));
list.add(Components.literal("- ...")
.withStyle(ChatFormatting.DARK_GRAY));
break;
}
ItemStack filterStack = filterItems.getStackInSlot(i);
if (filterStack.isEmpty())
continue;
list.add(Components.literal("- ").append(filterStack.getHoverName()).withStyle(ChatFormatting.GRAY));
list.add(Components.literal("- ")
.append(filterStack.getHoverName())
.withStyle(ChatFormatting.GRAY));
count++;
}
@ -123,10 +129,12 @@ public class FilterItem extends Item implements MenuProvider {
ItemAttribute attribute = ItemAttribute.fromNBT(compound);
boolean inverted = compound.getBoolean("Inverted");
if (count > 3) {
list.add(Components.literal("- ...").withStyle(ChatFormatting.DARK_GRAY));
list.add(Components.literal("- ...")
.withStyle(ChatFormatting.DARK_GRAY));
break;
}
list.add(Components.literal("- ").append(attribute.format(inverted)));
list.add(Components.literal("- ")
.append(attribute.format(inverted)));
count++;
}
@ -170,6 +178,8 @@ public class FilterItem extends Item implements MenuProvider {
ItemStackHandler newInv = new ItemStackHandler(18);
if (AllItems.FILTER.get() != stack.getItem())
throw new IllegalArgumentException("Cannot get filter items from non-filter: " + stack);
if (!stack.hasTag())
return newInv;
CompoundTag invNBT = stack.getOrCreateTagElement("Items");
if (!invNBT.isEmpty())
newInv.deserializeNBT(invNBT);
@ -189,15 +199,18 @@ public class FilterItem extends Item implements MenuProvider {
return true;
if (!(filter.getItem() instanceof FilterItem))
return (matchNBT ? ItemHandlerHelper.canItemStacksStack(filter, stack)
: ItemStack.isSame(filter, stack));
return (matchNBT ? ItemHandlerHelper.canItemStacksStack(filter, stack) : ItemStack.isSame(filter, stack));
boolean defaults = !filter.hasTag();
if (AllItems.FILTER.get() == filter.getItem()) {
ItemStackHandler filterItems = getFilterItems(filter);
boolean respectNBT = filter.getOrCreateTag()
.getBoolean("RespectNBT");
boolean blacklist = filter.getOrCreateTag()
.getBoolean("Blacklist");
boolean respectNBT = defaults ? false
: filter.getTag()
.getBoolean("RespectNBT");
boolean blacklist = defaults ? false
: filter.getTag()
.getBoolean("Blacklist");
for (int slot = 0; slot < filterItems.getSlots(); slot++) {
ItemStack stackInSlot = filterItems.getStackInSlot(slot);
if (stackInSlot.isEmpty())
@ -210,10 +223,12 @@ public class FilterItem extends Item implements MenuProvider {
}
if (AllItems.ATTRIBUTE_FILTER.get() == filter.getItem()) {
WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag()
.getInt("WhitelistMode")];
ListTag attributes = filter.getOrCreateTag()
.getList("MatchedAttributes", Tag.TAG_COMPOUND);
WhitelistMode whitelistMode = WhitelistMode.values()[defaults ? 0
: filter.getTag()
.getInt("WhitelistMode")];
ListTag attributes = defaults ? new ListTag()
: filter.getTag()
.getList("MatchedAttributes", Tag.TAG_COMPOUND);
for (Tag inbt : attributes) {
CompoundTag compound = (CompoundTag) inbt;
ItemAttribute attribute = ItemAttribute.fromNBT(compound);
@ -275,12 +290,16 @@ public class FilterItem extends Item implements MenuProvider {
return fluidEqual;
}
boolean defaults = !filter.hasTag();
if (AllItems.FILTER.get() == filter.getItem()) {
ItemStackHandler filterItems = getFilterItems(filter);
boolean respectNBT = filter.getOrCreateTag()
.getBoolean("RespectNBT");
boolean blacklist = filter.getOrCreateTag()
.getBoolean("Blacklist");
boolean respectNBT = defaults ? false
: filter.getTag()
.getBoolean("RespectNBT");
boolean blacklist = defaults ? false
: filter.getTag()
.getBoolean("Blacklist");
for (int slot = 0; slot < filterItems.getSlots(); slot++) {
ItemStack stackInSlot = filterItems.getStackInSlot(slot);
if (stackInSlot.isEmpty())

View File

@ -45,12 +45,12 @@ public class FilterMenu extends AbstractFilterMenu {
for (int col = 0; col < 9; ++col)
this.addSlot(new SlotItemHandler(ghostInventory, col + row * 9, x + col * 18, y + row * 18));
}
@Override
protected ItemStackHandler createGhostInventory() {
return FilterItem.getFilterItems(contentHolder);
}
@Override
protected void initAndReadInventory(ItemStack filterItem) {
super.initAndReadInventory(filterItem);
@ -58,13 +58,21 @@ public class FilterMenu extends AbstractFilterMenu {
respectNBT = tag.getBoolean("RespectNBT");
blacklist = tag.getBoolean("Blacklist");
}
@Override
protected void saveData(ItemStack filterItem) {
super.saveData(filterItem);
CompoundTag tag = filterItem.getOrCreateTag();
tag.putBoolean("RespectNBT", respectNBT);
tag.putBoolean("Blacklist", blacklist);
if (respectNBT || blacklist)
return;
for (int i = 0; i < ghostInventory.getSlots(); i++)
if (!ghostInventory.getStackInSlot(i)
.isEmpty())
return;
filterItem.setTag(null);
}
}

View File

@ -16,10 +16,13 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard;
import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.Components;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
@ -37,6 +40,8 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.wrapper.InvWrapper;
public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSettingsBehaviour {
@ -276,10 +281,17 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet
player.getItemInHand(hand)
.shrink(1);
}
if (getFilter().getItem() instanceof FilterItem)
}
if (getFilter().getItem() instanceof FilterItem) {
if (!player.isCreative() || ItemHelper
.extract(new InvWrapper(player.getInventory()),
stack -> ItemHandlerHelper.canItemStacksStack(stack, getFilter()), true)
.isEmpty())
player.getInventory()
.placeItemBackInInventory(getFilter());
}
if (toApply.getItem() instanceof FilterItem)
toApply.setCount(1);
@ -308,8 +320,6 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet
public boolean writeToClipboard(CompoundTag tag, Direction side) {
ValueSettingsBehaviour.super.writeToClipboard(tag, side);
ItemStack filter = getFilter(side);
if (filter.getItem() instanceof FilterItem)
return true;
tag.put("Filter", filter.serializeNBT());
return true;
}
@ -321,10 +331,48 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet
return upstreamResult;
if (simulate)
return true;
if (getFilter(side).getItem() instanceof FilterItem)
if (getWorld().isClientSide)
return true;
ItemStack refund = ItemStack.EMPTY;
if (getFilter(side).getItem() instanceof FilterItem && !player.isCreative())
refund = getFilter(side).copy();
ItemStack copied = ItemStack.of(tag.getCompound("Filter"));
if (copied.getItem() instanceof FilterItem filterType && !player.isCreative()) {
InvWrapper inv = new InvWrapper(player.getInventory());
for (boolean preferStacksWithoutData : Iterate.trueAndFalse) {
if (refund.getItem() != filterType && ItemHelper
.extract(inv, stack -> stack.getItem() == filterType && preferStacksWithoutData != stack.hasTag(),
1, false)
.isEmpty())
continue;
if (!refund.isEmpty() && refund.getItem() != filterType)
player.getInventory()
.placeItemBackInInventory(refund);
setFilter(side, copied);
return true;
}
player.displayClientMessage(Lang
.translate("logistics.filter.requires_item_in_inventory", copied.getHoverName()
.copy()
.withStyle(ChatFormatting.WHITE))
.style(ChatFormatting.RED)
.component(), true);
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
return false;
}
if (!refund.isEmpty())
player.getInventory()
.placeItemBackInInventory(getFilter(side).copy());
return setFilter(side, ItemStack.of(tag.getCompound("Filter")));
.placeItemBackInInventory(refund);
return setFilter(side, copied);
}
}

View File

@ -1030,9 +1030,10 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.pattern("P")
.pattern("G")),
CLIPBOARD_CLEAR = create(AllItems.CLIPBOARD).withSuffix("_clear")
.unlockedBy(AllItems.CLIPBOARD::get)
.viaShapeless(b -> b.requires(AllItems.CLIPBOARD.get())),
CLIPBOARD_CLEAR = clearData(AllItems.CLIPBOARD),
SCHEDULE_CLEAR = clearData(AllItems.SCHEDULE),
FILTER_CLEAR = clearData(AllItems.FILTER),
ATTRIBUTE_FILTER_CLEAR = clearData(AllItems.ATTRIBUTE_FILTER),
DIVING_HELMET = create(AllItems.COPPER_DIVING_HELMET).unlockedBy(I::copper)
.viaShaped(b -> b.define('G', Tags.Items.GLASS)
@ -1237,6 +1238,12 @@ public class StandardRecipeGen extends CreateRecipeProvider {
return result;
}
GeneratedRecipe clearData(ItemProviderEntry<? extends ItemLike> item) {
return create(item).withSuffix("_clear")
.unlockedBy(item::get)
.viaShapeless(b -> b.requires(item.get()));
}
class GeneratedRecipeBuilder {
private String path;

View File

@ -226,6 +226,7 @@
"create.logistics.filter.any_amount_short": "Any",
"create.logistics.filter.up_to": "Up to",
"create.logistics.filter.exactly": "Exactly",
"create.logistics.filter.requires_item_in_inventory": "Requires %1$s item in Inventory",
"create.logistics.creative_crate.supply": "Infinite Supply",
"create.logistics.train_observer.cargo_filter": "Cargo Filter",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 656 B

After

Width:  |  Height:  |  Size: 851 B