From 6f56772560354b381a0378566939fe0e4097a4cc Mon Sep 17 00:00:00 2001 From: Flanks255 <32142731+Flanks255@users.noreply.github.com> Date: Tue, 2 Apr 2024 18:46:52 -0500 Subject: [PATCH] Added Item Tag, to filter by a item tag. --- .../9cf54cdf67e16111ec482a2a3b607e8fd75a4246 | 3 +- .../b3ca5dca15f867120b82824364d3156b7fdfd666 | 3 +- .../models/item/item_tag.json | 6 ++ .../actuallyadditions/recipes/item_tag.json | 15 +++ .../data/ItemModelGenerator.java | 2 + .../data/ItemRecipeGenerator.java | 6 ++ .../actuallyadditions/mixin/AnvilMixin.java | 20 ++++ .../mixin/ItemCombinerMenuAccessor.java | 12 +++ .../mod/ActuallyAdditionsClient.java | 1 + .../mod/attachments/ActuallyAttachments.java | 3 + .../mod/attachments/ItemTagAttachment.java | 41 ++++++++ .../mod/event/CommonEvents.java | 27 +++++ .../mod/inventory/ActuallyContainers.java | 2 +- .../mod/inventory/ItemTagContainer.java | 42 ++++++++ .../mod/inventory/gui/ItemTagScreen.java | 99 +++++++++++++++++++ .../mod/items/ActuallyItems.java | 1 + .../actuallyadditions/mod/items/ItemTag.java | 43 ++++++++ .../mod/tile/FilterSettings.java | 16 ++- src/main/resources/META-INF/mods.toml | 2 + .../resources/actuallyadditions.mixins.json | 14 +++ .../assets/actuallyadditions/lang/en_us.json | 5 +- 21 files changed, 358 insertions(+), 5 deletions(-) create mode 100644 src/generated/resources/assets/actuallyadditions/models/item/item_tag.json create mode 100644 src/generated/resources/data/actuallyadditions/recipes/item_tag.json create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mixin/AnvilMixin.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mixin/ItemCombinerMenuAccessor.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ItemTagAttachment.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ItemTagContainer.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/ItemTagScreen.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemTag.java create mode 100644 src/main/resources/actuallyadditions.mixins.json diff --git a/src/generated/resources/.cache/9cf54cdf67e16111ec482a2a3b607e8fd75a4246 b/src/generated/resources/.cache/9cf54cdf67e16111ec482a2a3b607e8fd75a4246 index 63a4dc166..0e1203aaf 100644 --- a/src/generated/resources/.cache/9cf54cdf67e16111ec482a2a3b607e8fd75a4246 +++ b/src/generated/resources/.cache/9cf54cdf67e16111ec482a2a3b607e8fd75a4246 @@ -1,4 +1,4 @@ -// 1.20.4 2024-03-16T12:15:55.7079887 Item Recipes +// 1.20.4 2024-04-02T18:39:06.8390218 Item Recipes d374edde9294d1a224b4b5610b50117a11328c00 data/actuallyadditions/recipes/advanced_coil.json f67629e45d152c96f3467a90a67520f78ecf9f07 data/actuallyadditions/recipes/advanced_leaf_blower.json d65e5a70232fa2f0e74d2a67c1cd4b0e87124242 data/actuallyadditions/recipes/basic_coil.json @@ -84,6 +84,7 @@ ffa7a52a39d9261b9c90c62709183a1f2d8f8352 data/actuallyadditions/recipes/drill_up 811730c9a8496dd65e208a36d015b0671e86df1b data/actuallyadditions/recipes/gold_aiot.json 8b2ce2abfa8f78f7903c22347a54cdcf018d03eb data/actuallyadditions/recipes/handheld_filler.json a4e0e3bb72d472302f2ab4e5d282cbc7fd6882a6 data/actuallyadditions/recipes/iron_aiot.json +a444be2b854569191ca5f539bcf2536851eba59a data/actuallyadditions/recipes/item_tag.json 5615f6ad2e28e9c105491acb965e763dfe8cacab data/actuallyadditions/recipes/laser_upgrade_invisibility.json 38f744e92f1a5ff6a64e37cdfbb646422f741b3c data/actuallyadditions/recipes/laser_upgrade_range.json 0792f7ad8ae9bbe9e10951db70a41fc802a92f19 data/actuallyadditions/recipes/laser_wrench.json diff --git a/src/generated/resources/.cache/b3ca5dca15f867120b82824364d3156b7fdfd666 b/src/generated/resources/.cache/b3ca5dca15f867120b82824364d3156b7fdfd666 index 1d62b54da..c0a2db962 100644 --- a/src/generated/resources/.cache/b3ca5dca15f867120b82824364d3156b7fdfd666 +++ b/src/generated/resources/.cache/b3ca5dca15f867120b82824364d3156b7fdfd666 @@ -1,4 +1,4 @@ -// 1.20.4 2024-03-13T16:28:37.0564484 Item Models: actuallyadditions +// 1.20.4 2024-03-17T15:47:34.5137353 Item Models: actuallyadditions 34463d3d2ae3fafaaea338e7ffc03cd139d3cfeb assets/actuallyadditions/models/item/advanced_coil.json 24594fc68e66011dc2d7b79b92c94b387e710318 assets/actuallyadditions/models/item/advanced_leaf_blower.json ba2d814e269cdef72e1045f200b3c20ed6961517 assets/actuallyadditions/models/item/atomic_reconstructor.json @@ -130,6 +130,7 @@ d058286787b169cd09245f2cae6606bfedeb4813 assets/actuallyadditions/models/item/he f9f045a7713addffc4c419d1a3acdc9eac176065 assets/actuallyadditions/models/item/iron_aiot.json bd9be4f8d1235d6a418280c0a9a585c53360a99e assets/actuallyadditions/models/item/iron_casing.json 4b742b7bf9df6b8f745ed00ac29860959ff6f076 assets/actuallyadditions/models/item/item_interface.json +9186aec3aa11a45a2b24103e84126c200f2ac5c2 assets/actuallyadditions/models/item/item_tag.json a0545bce8530d20e0d87775144ed47f2df070219 assets/actuallyadditions/models/item/lamp_black.json ddecd4c60d4d0f77175eaa0178f6397afd7ee98f assets/actuallyadditions/models/item/lamp_blue.json 53e733a0cf113affea99490724efd72ee28cf823 assets/actuallyadditions/models/item/lamp_brown.json diff --git a/src/generated/resources/assets/actuallyadditions/models/item/item_tag.json b/src/generated/resources/assets/actuallyadditions/models/item/item_tag.json new file mode 100644 index 000000000..5cfa9dd85 --- /dev/null +++ b/src/generated/resources/assets/actuallyadditions/models/item/item_tag.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/paper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/actuallyadditions/recipes/item_tag.json b/src/generated/resources/data/actuallyadditions/recipes/item_tag.json new file mode 100644 index 000000000..33dcc0382 --- /dev/null +++ b/src/generated/resources/data/actuallyadditions/recipes/item_tag.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "actuallyadditions:black_quartz" + } + ], + "result": { + "item": "actuallyadditions:item_tag" + } +} \ No newline at end of file diff --git a/src/main/java/de/ellpeck/actuallyadditions/data/ItemModelGenerator.java b/src/main/java/de/ellpeck/actuallyadditions/data/ItemModelGenerator.java index d566ea336..17bcddf32 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/data/ItemModelGenerator.java +++ b/src/main/java/de/ellpeck/actuallyadditions/data/ItemModelGenerator.java @@ -36,6 +36,8 @@ public class ItemModelGenerator extends ItemModelProvider { ActuallyItems.SIMPLE_ITEMS.forEach(this::simpleItem); ActuallyItems.TOOLS.forEach(this::simpleTool); + singleTexture("item_tag", mcLoc("item/generated"), "layer0", mcLoc("item/paper")); + // Toolsets /* ActuallyItems.ALL_TOOL_SETS.stream() .map(ToolSet::getItemGroup) diff --git a/src/main/java/de/ellpeck/actuallyadditions/data/ItemRecipeGenerator.java b/src/main/java/de/ellpeck/actuallyadditions/data/ItemRecipeGenerator.java index 349b6f2af..acdd7638a 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/data/ItemRecipeGenerator.java +++ b/src/main/java/de/ellpeck/actuallyadditions/data/ItemRecipeGenerator.java @@ -517,6 +517,12 @@ public class ItemRecipeGenerator extends RecipeProvider { .define('I', Items.IRON_HELMET) .save(recipeOutput); + // Item Tag + Recipe.shapeless(ActuallyItems.ITEM_TAG.get()) + .requires(Items.PAPER) + .requires(ActuallyItems.BLACK_QUARTZ) + .save(recipeOutput); + // Sticky Piston from tagged slime balls Recipe.shaped(Items.STICKY_PISTON) .pattern("R", "P") diff --git a/src/main/java/de/ellpeck/actuallyadditions/mixin/AnvilMixin.java b/src/main/java/de/ellpeck/actuallyadditions/mixin/AnvilMixin.java new file mode 100644 index 000000000..351d15aa5 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mixin/AnvilMixin.java @@ -0,0 +1,20 @@ +package de.ellpeck.actuallyadditions.mixin; + +import de.ellpeck.actuallyadditions.mod.items.ItemTag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AnvilMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(AnvilMenu.class) +public class AnvilMixin{ + @Inject(method = "mayPickup", at = @At("HEAD"), cancellable = true) + public void pickupMixin(Player pPlayer, boolean pHasStack, CallbackInfoReturnable cir) { + AnvilMenu anvilMenu = (AnvilMenu) (Object) this; + if (((ItemCombinerMenuAccessor)anvilMenu).getInputSlots().getItem(0).getItem() instanceof ItemTag) { + cir.setReturnValue(true); + } + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mixin/ItemCombinerMenuAccessor.java b/src/main/java/de/ellpeck/actuallyadditions/mixin/ItemCombinerMenuAccessor.java new file mode 100644 index 000000000..c2c233c46 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mixin/ItemCombinerMenuAccessor.java @@ -0,0 +1,12 @@ +package de.ellpeck.actuallyadditions.mixin; + +import net.minecraft.world.Container; +import net.minecraft.world.inventory.ItemCombinerMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemCombinerMenu.class) +public interface ItemCombinerMenuAccessor { + @Accessor + Container getInputSlots(); +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java index 1053ecfb6..28d61802e 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditionsClient.java @@ -66,6 +66,7 @@ public class ActuallyAdditionsClient { evt.register(ActuallyContainers.PHANTOM_PLACER_CONTAINER.get(), GuiPhantomPlacer::new); evt.register(ActuallyContainers.RANGED_COLLECTOR_CONTAINER.get(), GuiRangedCollector::new); evt.register(ActuallyContainers.XPSOLIDIFIER_CONTAINER.get(), GuiXPSolidifier::new); + evt.register(ActuallyContainers.ITEM_TAG_CONTAINER.get(), ItemTagScreen::new); } public static void setup(FMLClientSetupEvent event) { diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ActuallyAttachments.java b/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ActuallyAttachments.java index d1aa40ca0..32b72eb9f 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ActuallyAttachments.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ActuallyAttachments.java @@ -17,6 +17,9 @@ public class ActuallyAttachments { public static final Supplier> ENERGY_STORAGE = ATTACHMENT_TYPES.register( "energy", ActuallyAttachments.itemEnergyStorageAttachment()); + public static final Supplier> ITEM_TAG = ATTACHMENT_TYPES.register( + "item_tag", () -> AttachmentType.serializable(ItemTagAttachment::new).build()); + /* * This is a supplier for an attachment type that can be used to attach an energy storage to an item. * Implementation is based on EnderIO's https://github.com/Team-EnderIO/EnderIO/blob/e1f022df745131ed5fea718bd860880a5785d4c7/src/core/java/com/enderio/core/common/attachment/AttachmentUtil.java#L47-L60 diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ItemTagAttachment.java b/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ItemTagAttachment.java new file mode 100644 index 000000000..04fdd36b3 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/attachments/ItemTagAttachment.java @@ -0,0 +1,41 @@ +package de.ellpeck.actuallyadditions.mod.attachments; + +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Optional; + +public class ItemTagAttachment implements INBTSerializable { + private TagKey tag; + + + @Override + public CompoundTag serializeNBT() { + CompoundTag nbt = new CompoundTag(); + if (tag != null) { + nbt.putString("tag", tag.location().toString()); + } + return nbt; + } + + @Override + public void deserializeNBT(@Nonnull CompoundTag nbt) { + if (nbt.contains("tag")) { + tag = TagKey.create(Registries.ITEM, new ResourceLocation(nbt.getString("tag"))); + } + } + + public Optional> getTag() { + return Optional.ofNullable(tag); + } + + public void setTag(@Nullable TagKey tag) { + this.tag = tag; + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java b/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java index d671497ea..2cb54d5cb 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java @@ -11,11 +11,13 @@ package de.ellpeck.actuallyadditions.mod.event; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.attachments.ActuallyAttachments; import de.ellpeck.actuallyadditions.mod.config.CommonConfig; import de.ellpeck.actuallyadditions.mod.config.values.ConfigBoolValues; import de.ellpeck.actuallyadditions.mod.data.PlayerData; import de.ellpeck.actuallyadditions.mod.data.WorldData; import de.ellpeck.actuallyadditions.mod.items.ActuallyItems; +import de.ellpeck.actuallyadditions.mod.items.ItemTag; import de.ellpeck.actuallyadditions.mod.items.Sack; import de.ellpeck.actuallyadditions.mod.network.PacketHandlerHelper; import de.ellpeck.actuallyadditions.mod.sack.SackManager; @@ -24,15 +26,20 @@ import de.ellpeck.actuallyadditions.mod.util.ItemStackHandlerAA; import de.ellpeck.actuallyadditions.mod.util.ItemUtil; import de.ellpeck.actuallyadditions.mod.util.StackUtil; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.TagKey; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.AnvilUpdateEvent; import net.neoforged.neoforge.event.entity.living.LivingDropsEvent; import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; @@ -203,4 +210,24 @@ public class CommonEvents { public void onPickupEvent(EntityItemPickupEvent event) { //checkAchievements(event.getItem().getItem(), event.getEntityPlayer(), InitAchievements.Type.PICK_UP); } + @SubscribeEvent + public void onAnvilEvent(AnvilUpdateEvent event) { + if (!event.getLeft().isEmpty() && event.getLeft().getItem() instanceof ItemTag && event.getName() != null && !event.getName().isEmpty()) { + event.setCost(0); + if (ResourceLocation.isValidResourceLocation(event.getName())) { + TagKey tagKey = TagKey.create(Registries.ITEM, new ResourceLocation(event.getName())); + var tag = BuiltInRegistries.ITEM.getTag(tagKey); + if (tag.isPresent()) { + ItemStack stack = event.getLeft().copy(); + stack.getData(ActuallyAttachments.ITEM_TAG).setTag(tagKey); + event.setOutput(stack); + } else { + event.setCanceled(true); + } + } + else { + event.setCanceled(true); + } + } + } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ActuallyContainers.java b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ActuallyContainers.java index 96f3834b6..af2bb3748 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ActuallyContainers.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ActuallyContainers.java @@ -38,6 +38,6 @@ public class ActuallyContainers { public static final Supplier> PHANTOM_PLACER_CONTAINER = CONTAINERS.register("phantom_placer_container", () -> IMenuTypeExtension.create(ContainerPhantomPlacer::fromNetwork)); public static final Supplier> RANGED_COLLECTOR_CONTAINER = CONTAINERS.register("ranged_collector_container", () -> IMenuTypeExtension.create(ContainerRangedCollector::fromNetwork)); public static final Supplier> XPSOLIDIFIER_CONTAINER = CONTAINERS.register("xpsolidifier_container", () -> IMenuTypeExtension.create(ContainerXPSolidifier::fromNetwork)); - + public static final Supplier> ITEM_TAG_CONTAINER = CONTAINERS.register("item_tag_container", () -> IMenuTypeExtension.create(ItemTagContainer::fromNetwork)); } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ItemTagContainer.java b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ItemTagContainer.java new file mode 100644 index 000000000..8a2b634ef --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/ItemTagContainer.java @@ -0,0 +1,42 @@ +package de.ellpeck.actuallyadditions.mod.inventory; + +import de.ellpeck.actuallyadditions.mod.attachments.ActuallyAttachments; +import de.ellpeck.actuallyadditions.mod.items.ItemTag; +import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nonnull; + +public class ItemTagContainer extends AbstractContainerMenu implements IButtonReactor { + public ItemTagContainer(int windowId, Inventory playerInventory) { + super(ActuallyContainers.ITEM_TAG_CONTAINER.get(), windowId); + } + + public static ItemTagContainer fromNetwork(int windowId, Inventory inv, FriendlyByteBuf data) { + return new ItemTagContainer(windowId, inv); + } + + @Nonnull + @Override + public ItemStack quickMoveStack(@Nonnull Player pPlayer, int pIndex) { + return ItemStack.EMPTY; + } + + @Override + public boolean stillValid(@Nonnull Player pPlayer) { + return pPlayer.getInventory().getSelected().getItem() instanceof ItemTag; + } + + @Override + public void onButtonPressed(int buttonID, Player player) { + ItemStack stack = player.getInventory().getSelected(); + stack.getExistingData(ActuallyAttachments.ITEM_TAG).ifPresent(data -> { + data.setTag(null); + stack.setData(ActuallyAttachments.ITEM_TAG, data); + }); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/ItemTagScreen.java b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/ItemTagScreen.java new file mode 100644 index 000000000..973dcd97f --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/gui/ItemTagScreen.java @@ -0,0 +1,99 @@ +package de.ellpeck.actuallyadditions.mod.inventory.gui; + +import de.ellpeck.actuallyadditions.mod.inventory.ItemTagContainer; +import de.ellpeck.actuallyadditions.mod.network.PacketClientToServer; +import de.ellpeck.actuallyadditions.mod.network.PacketHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.StringWidget; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Item; +import net.neoforged.neoforge.network.PacketDistributor; +import org.lwjgl.glfw.GLFW; + +import javax.annotation.Nonnull; +import java.util.Optional; + +public class ItemTagScreen extends AAScreen { + private EditBox tagBox; + private StringWidget testText; + private boolean validTag = false; + public ItemTagScreen(ItemTagContainer container, Inventory inventory, Component pTitle) { + super(container, inventory, pTitle); + } + + @Override + protected void init() { + super.init(); + + this.testText = new StringWidget(this.leftPos + 7, this.topPos + 27, 162, 20, Component.literal(""), font); + this.addRenderableWidget(this.testText); + + this.tagBox = new EditBox(this.font, this.leftPos + 7, this.topPos + 7, 162, 20, Component.nullToEmpty("Tag")); + this.tagBox.setMaxLength(128); + this.tagBox.setCanLoseFocus(false); + setInitialFocus(this.tagBox); + this.tagBox.setValue(""); + this.tagBox.setResponder(this::textChanged); + + this.addRenderableWidget(this.tagBox); + } + + @Override + protected void renderBg(@Nonnull GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) { + + } + + private void textChanged(String text) { + boolean valid = validateTag(text); + + if (valid) { + this.tagBox.setTextColor(0x00FF00); + TagKey tagKey = TagKey.create(Registries.ITEM, new ResourceLocation(text)); + Optional> optionalNamed = BuiltInRegistries.ITEM.getTag(tagKey); + + if (optionalNamed.isPresent()) { + this.testText.setMessage(Component.literal("Valid Tag")); + this.testText.setColor(0x00FF00); + validTag = true; + } else { + this.testText.setMessage(Component.literal("Invalid Tag")); + this.testText.setColor(0xFF0000); + } + } + else { + tagBox.setTextColor(0xFF0000); + validTag = false; + } + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (pKeyCode == GLFW.GLFW_KEY_ESCAPE) { + this.minecraft.player.closeContainer(); + } + if (pKeyCode == GLFW.GLFW_KEY_ENTER && validTag) { + CompoundTag data = new CompoundTag(); + data.putInt("ButtonID", 0); + data.putInt("PlayerID", Minecraft.getInstance().player.getId()); + data.putString("WorldID", Minecraft.getInstance().level.dimension().location().toString()); + data.putString("Tag", tagBox.getValue()); + PacketDistributor.SERVER.noArg().send(new PacketClientToServer(data, PacketHandler.GUI_BUTTON_TO_CONTAINER_HANDLER)); + this.minecraft.player.closeContainer(); + } + + return tagBox.keyPressed(pKeyCode, pScanCode, pModifiers) || tagBox.canConsumeInput() || super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + private boolean validateTag(String tag) { + return ResourceLocation.isValidResourceLocation(tag); + //return !tag.matches("^[a-z0-9_\\-]+:[a-z0-9_\\-]+(/[a-z0-9_\\-]+)*$"); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ActuallyItems.java b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ActuallyItems.java index 8f28774c2..98af4ae41 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ActuallyItems.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ActuallyItems.java @@ -109,6 +109,7 @@ public final class ActuallyItems { public static final DeferredItem WORM = ITEMS.register("worm", Worm::new); public static final DeferredItem PLAYER_PROBE = ITEMS.register("player_probe", ItemPlayerProbe::new); public static final DeferredItem FILTER = ITEMS.register("filter", ItemFilter::new); + public static final DeferredItem ITEM_TAG = ITEMS.register("item_tag", ItemTag::new); public static final DeferredItem WATER_BOWL = ITEMS.register("water_bowl", ItemWaterBowl::new); public static final DeferredItem CRATE_KEEPER = ITEMS.register("crate_keeper", () -> new ItemGeneric(defaultProps().stacksTo(1))); public static final DeferredItem LENS_OF_COLOR = ITEMS.register("lens_of_color", () -> new ItemLens(ActuallyAdditionsAPI.lensColor)); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemTag.java b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemTag.java new file mode 100644 index 000000000..ca5be5200 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemTag.java @@ -0,0 +1,43 @@ +package de.ellpeck.actuallyadditions.mod.items; + +import de.ellpeck.actuallyadditions.mod.attachments.ActuallyAttachments; +import de.ellpeck.actuallyadditions.mod.attachments.ItemTagAttachment; +import de.ellpeck.actuallyadditions.mod.items.base.ItemBase; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; +import java.util.List; + +public class ItemTag extends ItemBase { + @Override + public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { + var data = pStack.getExistingData(ActuallyAttachments.ITEM_TAG); +/* data.flatMap(ItemTagAttachment::getTag).ifPresent(itemTag -> { + BuiltInRegistries.ITEM.getTag(itemTag).ifPresent(itemTagCollection -> { + pTooltipComponents.add(Component.literal("Valid Tag").withStyle(ChatFormatting.GREEN)); + pTooltipComponents.add(Component.literal("Tag: " + itemTag.location()).withStyle(ChatFormatting.GRAY)); + pTooltipComponents.add(Component.literal("Contains: " + itemTagCollection.stream().count() + " items").withStyle(ChatFormatting.GRAY)); + }); + });*/ + data.flatMap(ItemTagAttachment::getTag).ifPresentOrElse( + itemTag -> pTooltipComponents.add(Component.literal("Tag: " + itemTag.location()).withStyle(ChatFormatting.GRAY)), + () -> pTooltipComponents.add(Component.translatable("tooltip.actuallyadditions.item_tag.no_tag").withStyle(ChatFormatting.RED) + )); + + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + } + + +/* @Nonnull + @Override + public InteractionResultHolder use(Level pLevel, @Nonnull Player pPlayer, @Nonnull InteractionHand pUsedHand) { + if (!pLevel.isClientSide) + pPlayer.openMenu(new SimpleMenuProvider((pId, pInventory, player) -> new ItemTagContainer(pId, pInventory), Component.translatable("container.actuallyadditions.item_tag"))); + + return super.use(pLevel, pPlayer, pUsedHand); + }*/ +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/FilterSettings.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/FilterSettings.java index 7fbb0468c..4b8c44483 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/FilterSettings.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/FilterSettings.java @@ -10,9 +10,11 @@ package de.ellpeck.actuallyadditions.mod.tile; +import de.ellpeck.actuallyadditions.mod.attachments.ActuallyAttachments; import de.ellpeck.actuallyadditions.mod.inventory.ContainerFilter; import de.ellpeck.actuallyadditions.mod.inventory.slot.SlotFilter; import de.ellpeck.actuallyadditions.mod.items.DrillItem; +import de.ellpeck.actuallyadditions.mod.items.ItemTag; import de.ellpeck.actuallyadditions.mod.util.ItemStackHandlerAA; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; @@ -61,7 +63,19 @@ public class FilterSettings { return whitelist; } } - } else if (areEqualEnough(slot, stack, mod)) { + } + else if (slot.getItem() instanceof ItemTag) { + var data = slot.getExistingData(ActuallyAttachments.ITEM_TAG); + if (data.isPresent()) { + var tag = data.get().getTag(); + if (tag.isPresent()) { + if (stack.is(tag.get())) { + return whitelist; + } + } + } + } + else if (areEqualEnough(slot, stack, mod)) { return whitelist; } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index cb99a62dc..9d58e4868 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -12,6 +12,8 @@ authors="Ellpeck" description=''' Do you want Automation? Wireless Transport? Better Machines? A cup o\' Coffee? Chests? Better Hoppers? Leaf Blowers? Faster Growth? Plants? Well, Actually Additions has all that and a lot more! ''' +[[mixins]] +config = "actuallyadditions.mixins.json" [[dependencies.actuallyadditions]] modId="neoforge" diff --git a/src/main/resources/actuallyadditions.mixins.json b/src/main/resources/actuallyadditions.mixins.json new file mode 100644 index 000000000..8e513d17f --- /dev/null +++ b/src/main/resources/actuallyadditions.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8.5", + "compatibilityLevel": "JAVA_17", + "package": "de.ellpeck.actuallyadditions.mixin", + "target": "@env(DEFAULT)", + "mixins": [ + "AnvilMixin", + "ItemCombinerMenuAccessor" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/actuallyadditions/lang/en_us.json b/src/main/resources/assets/actuallyadditions/lang/en_us.json index 54c2fd913..79ccdf5aa 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_us.json +++ b/src/main/resources/assets/actuallyadditions/lang/en_us.json @@ -397,6 +397,7 @@ "item.actuallyadditions.phan_con_pattern.desc": "Phantom Connector", "item.actuallyadditions.book_pattern": "Banner Pattern", "item.actuallyadditions.book_pattern.desc": "Book", + "item.actuallyadditions.item_tag" : "Item Tag", "_comment": "Tooltips", "tooltip.actuallyadditions.onSuffix.desc": "On", "tooltip.actuallyadditions.phantom.connected.desc": "", @@ -443,6 +444,7 @@ "tooltip.actuallyadditions.item_filling_wand.selected_block": "Selected Block: %s", "tooltip.actuallyadditions.item_filling_wand.selected_block.none": "None", "tooltip.actuallyadditions.coffeeCup.noEffect": "No Effects", + "tooltip.actuallyadditions.item_tag.no_tag": "Use Anvil to set tag.", "_comment": "Gui Information", "info.actuallyadditions.gui.animals": "Animals", "info.actuallyadditions.gui.enoughToBreed": "Enough to breed!", @@ -985,5 +987,6 @@ "jei.actuallyadditions.coffee.maxAmount": "Max Amount", "jei.actuallyadditions.coffee.extra.milk": "+01:00, -1 Level", "jei.actuallyadditions.mining_lens": "Lens of the Miner", - "jei.actuallyadditions.mining_lens.weight": "Weight:" + "jei.actuallyadditions.mining_lens.weight": "Weight:", + "container.actuallyadditions.item_tag": "Item Tag" }