From 13582f508aee342a7b6a1cd56baed2fcf0164056 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:16:46 +0100 Subject: [PATCH] Is it gone or just empty - Fixed item copying recipes and components sticking around on unconfigured items - Added moving interaction for copper doors and trapdoors --- .../simibubi/create/AllInteractionBehaviours.java | 4 ++-- .../equipment/clipboard/ClipboardBlockItem.java | 6 ++++++ .../equipment/clipboard/ClipboardEditPacket.java | 2 ++ .../equipment/clipboard/ClipboardEntry.java | 3 --- .../equipment/clipboard/ClipboardScreen.java | 14 +++++++++++++- .../logistics/filter/AbstractFilterMenu.java | 8 +++++++- .../logistics/filter/AttributeFilterMenu.java | 2 +- .../content/logistics/filter/FilterItem.java | 11 ++++++++++- .../logistics/filter/PackageFilterMenu.java | 5 ++++- .../content/trains/schedule/ScheduleItem.java | 6 ++++++ .../foundation/recipe/ItemCopyingRecipe.java | 10 +++++++--- 11 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllInteractionBehaviours.java b/src/main/java/com/simibubi/create/AllInteractionBehaviours.java index e9012835dd..b26da993fe 100644 --- a/src/main/java/com/simibubi/create/AllInteractionBehaviours.java +++ b/src/main/java/com/simibubi/create/AllInteractionBehaviours.java @@ -63,7 +63,7 @@ public class AllInteractionBehaviours { DoorMovingInteraction doorBehaviour = new DoorMovingInteraction(); registerBehaviourProvider(state -> { - if (state.is(BlockTags.WOODEN_DOORS)) { + if (state.is(BlockTags.MOB_INTERACTABLE_DOORS)) { return doorBehaviour; } return null; @@ -71,7 +71,7 @@ public class AllInteractionBehaviours { TrapdoorMovingInteraction trapdoorBehaviour = new TrapdoorMovingInteraction(); registerBehaviourProvider(state -> { - if (state.is(BlockTags.WOODEN_TRAPDOORS)) { + if (state.is(BlockTags.TRAPDOORS) && !state.is(Blocks.IRON_TRAPDOOR)) { return trapdoorBehaviour; } return null; diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java index 4d69a51068..c870510edb 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java @@ -10,6 +10,7 @@ import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponentType; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -76,5 +77,10 @@ public class ClipboardBlockItem extends BlockItem implements SupportsItemCopying public void registerModelOverrides() { CatnipServices.PLATFORM.executeOnClientOnly(() -> () -> ClipboardOverrides.registerModelOverridesClient(this)); } + + @Override + public DataComponentType getComponentType() { + return AllDataComponents.CLIPBOARD_PAGES; + } } diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java index 5af41d7fc3..556d2e18ab 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java @@ -40,6 +40,7 @@ public record ClipboardEditPacket(int hotbarSlot, DataComponentPatch dataCompone if (processedData.isEmpty()) { clearComponents(cbe.dataContainer); } else { + cbe.dataContainer.remove(AllDataComponents.CLIPBOARD_PREVIOUSLY_OPENED_PAGE); cbe.dataContainer.applyComponents(processedData); } cbe.onEditedBy(sender); @@ -54,6 +55,7 @@ public record ClipboardEditPacket(int hotbarSlot, DataComponentPatch dataCompone if (processedData.isEmpty()) { clearComponents(itemStack); } else { + itemStack.remove(AllDataComponents.CLIPBOARD_PREVIOUSLY_OPENED_PAGE); itemStack.applyComponents(processedData); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java index eb73af42cb..7d9b1b5fa9 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import com.google.common.collect.ImmutableList; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.simibubi.create.AllDataComponents; @@ -19,8 +18,6 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.UnmodifiableView; - public class ClipboardEntry { public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( Codec.BOOL.fieldOf("checked").forGetter(c -> c.checked), diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java index 39cf02b6d8..ce6c6fbcd9 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java @@ -343,8 +343,11 @@ public class ClipboardScreen extends AbstractSimiScreen { pages.removeIf(List::isEmpty); for (int i = 0; i < pages.size(); i++) - if (pages.get(i) == currentEntries) + if (pages.get(i) == currentEntries) { item.set(AllDataComponents.CLIPBOARD_PREVIOUSLY_OPENED_PAGE, i); + if (i == 0) + item.remove(AllDataComponents.CLIPBOARD_PREVIOUSLY_OPENED_PAGE); + } send(); @@ -361,6 +364,15 @@ public class ClipboardScreen extends AbstractSimiScreen { private void send() { ClipboardEntry.saveAll(pages, item); ClipboardOverrides.switchTo(ClipboardType.WRITTEN, item); + + if (pages.isEmpty()) { + item.remove(AllDataComponents.CLIPBOARD_PAGES); + item.remove(AllDataComponents.CLIPBOARD_PREVIOUSLY_OPENED_PAGE); + item.remove(AllDataComponents.CLIPBOARD_READ_ONLY); + item.remove(AllDataComponents.CLIPBOARD_TYPE); + item.remove(AllDataComponents.CLIPBOARD_COPIED_VALUES); + } + CatnipServices.NETWORK.sendToServer(new ClipboardEditPacket(targetSlot, item.getComponentsPatch(), targetedBlock)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterMenu.java index de9dec4234..de814b57d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterMenu.java @@ -55,7 +55,13 @@ public abstract class AbstractFilterMenu extends GhostItemMenu { @Override protected void saveData(ItemStack contentHolder) { - contentHolder.set(AllDataComponents.FILTER_ITEMS, ItemHelper.containerContentsFromHandler(ghostInventory)); + for (int i = 0; i < ghostInventory.getSlots(); i++) { + if (!ghostInventory.getStackInSlot(i).isEmpty()) { + contentHolder.set(AllDataComponents.FILTER_ITEMS, ItemHelper.containerContentsFromHandler(ghostInventory)); + return; + } + } + contentHolder.remove(AllDataComponents.FILTER_ITEMS); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java index a89684a612..8b3af0ccad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java @@ -124,7 +124,7 @@ public class AttributeFilterMenu extends AbstractFilterMenu { protected void initAndReadInventory(ItemStack filterItem) { super.initAndReadInventory(filterItem); selectedAttributes = new ArrayList<>(); - whitelistMode = filterItem.get(AllDataComponents.ATTRIBUTE_FILTER_WHITELIST_MODE); + whitelistMode = filterItem.getOrDefault(AllDataComponents.ATTRIBUTE_FILTER_WHITELIST_MODE, AttributeFilterWhitelistMode.WHITELIST_DISJ); List attributes = filterItem.getOrDefault(AllDataComponents.ATTRIBUTE_FILTER_MATCHED_ATTRIBUTES, new ArrayList<>()); selectedAttributes.addAll(attributes); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index e456b62b66..4d7d9d2fd5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -88,7 +88,7 @@ public class FilterItem extends Item implements MenuProvider, SupportsItemCopyin private List makeSummary(ItemStack filter) { List list = new ArrayList<>(); - if (!filter.isComponentsPatchEmpty()) + if (filter.isComponentsPatchEmpty()) return list; if (type == FilterType.REGULAR) { @@ -235,4 +235,13 @@ public class FilterItem extends Item implements MenuProvider, SupportsItemCopyin return true; } + @Override + public DataComponentType getComponentType() { + return switch (type) { + case ATTRIBUTE -> AllDataComponents.ATTRIBUTE_FILTER_MATCHED_ATTRIBUTES; + case PACKAGE -> AllDataComponents.PACKAGE_ADDRESS; + case REGULAR -> AllDataComponents.FILTER_ITEMS; + }; + } + } 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 dd4db5d90d..386afa79e7 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 @@ -59,7 +59,10 @@ public class PackageFilterMenu extends AbstractFilterMenu { @Override protected void saveData(ItemStack filterItem) { super.saveData(filterItem); - filterItem.set(AllDataComponents.PACKAGE_ADDRESS, address); + if (address.isBlank()) + filterItem.remove(AllDataComponents.PACKAGE_ADDRESS); + else + filterItem.set(AllDataComponents.PACKAGE_ADDRESS, address); } } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java index 5687f0b3d8..5aea27385d 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java @@ -18,6 +18,7 @@ import net.createmod.catnip.data.Couple; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentType; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -164,5 +165,10 @@ public class ScheduleItem extends Item implements MenuProvider, SupportsItemCopy public Component getDisplayName() { return getDescription(); } + + @Override + public DataComponentType getComponentType() { + return AllDataComponents.TRAIN_SCHEDULE; + } } diff --git a/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java index 345c0f8195..01f7ef4ba8 100644 --- a/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java +++ b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java @@ -6,12 +6,14 @@ import com.simibubi.create.AllRecipeTypes; import net.createmod.catnip.data.IntAttached; import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.Level; public class ItemCopyingRecipe extends CustomRecipe { @@ -20,18 +22,20 @@ public class ItemCopyingRecipe extends CustomRecipe { public default ItemStack createCopy(ItemStack original, int count) { ItemStack copyWithCount = original.copyWithCount(count); - copyWithCount.remove(DataComponents.ENCHANTMENTS); + copyWithCount.set(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); copyWithCount.remove(DataComponents.STORED_ENCHANTMENTS); return copyWithCount; } public default boolean canCopyFromItem(ItemStack item) { - return item.isComponentsPatchEmpty(); + return item.has(getComponentType()); } public default boolean canCopyToItem(ItemStack item) { - return !item.isComponentsPatchEmpty(); + return !item.has(getComponentType()); } + + public DataComponentType getComponentType(); }